0

我无法制作使用会话的 PHP 生成的 Varnish 3.0.2 缓存文件。我知道默认情况下 Varnish 不会使用 Set-Cookie 缓存文件,但我相信我正在删除此标头。

sub vcl_recv {
        # PHP Generated CSS
        if( req.url ~ "^/css/" ) {
                unset req.http.Max-Age;
                unset req.http.Pragma;
                unset req.http.Cache-Control;
                unset req.http.Cookie;
                return(lookup);
        }

sub vcl_fetch {
 if( req.url ~ "^/css/" ) {
     remove beresp.http.Cache-Control;
     remove beresp.http.Pragma;
     remove beresp.http.set-cookie;
 }

 if (beresp.ttl <= 0s ||
     beresp.http.Set-Cookie ||
     beresp.http.Vary == "*") {
            std.log("--------- HIT FOR PASS --------");
            set beresp.ttl = 920s;
            return (hit_for_pass);
 }
 return (deliver);
}

每个 PHP 请求都将转到 hit_for_pass 并且永远不会被缓存。TTL 值始终为 -1。

4

1 回答 1

1

从这里提供的信息来看,最可能的原因是后端发送了一个 Cache-Control 响应头,使得 Varnish 将 TTL 设置为 0。

在 varnishlog 中查找“TTL”日志行,如下所示:

   21 TTL          c 216230930 RFC 600 -1 -1 1362839670 0 1362839669 1362840269 600
   21 TTL          c 216230930 VCL 600 86400 -1 1362839670 -0

第一条记录是 Varnish(在 vcl_fetch 运行之前)决定对 TTL 的响应标头,第二条是在 VCL 中进行一些修改后的内容。前三个的顺序是 TTL、grace 和 keep。您只需要担心 TTL。在这种情况下是 600 秒/10 分钟。

此处无需在 recv 和 fetch 中使用 return()。只需让逻辑落入默认的 VCL,从长远来看,它将为您省去痛苦。

于 2013-03-09T14:41:07.950 回答