PHP会话导致varnish不缓存
我正在努力理解清漆的行为,并希望有人可以解决一些问题.
我正在做一个测试,我正在尝试使用varnish来缓存请求/响应cookie. 我有一个非常简单的PHP脚本,它简单的启动会话. <?php session_start(); ?> 我确实希望varnish不要因为Set-Cookie和Cookie标头而缓存. 我会去取消这些标题: sub vcl_backend_response { unset beresp.http.set-cookie; } sub vcl_recv { unset req.http.cookie; } 请求的页面仍未缓存. 我知道PHP会发送一个可能被varnish尊重的缓存破坏标头.让我们检查: <?php echo session_cache_limiter(); ?> 输出:nocache 从session_cache_limiter()文档中可以看出,nocache将发送这些响应标头以破坏缓存: Expires: Thu,19 Nov 1981 08:52:00 GMT Cache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 Pragma: no-cache 让我们解开它们: sub vcl_backend_response { unset beresp.http.expires; unset beresp.http.pragma; unset beresp.http.cache-control; unset beresp.http.set-cookie; } 至于这一点,我希望varnish能够缓存,但仍然没有缓存. 有效的修复是设置一个ttl: sub vcl_backend_response { unset beresp.http.expires; unset beresp.http.pragma; unset beresp.http.cache-control; unset beresp.http.set-cookie; # THIS MADE VARNISH TO CACHE set beresp.ttl = 10m; } 现在的问题是: 如果默认值为2m(在下面的CLI中为-t 120)并且所有缓存清除头都被处理,为什么我需要显式设置TTL? /usr/sbin/varnishd -P /var/run/varnish.pid -f /etc/varnish/default.vcl -a :80 -T 0.0.0.0:6082 -t 120 -u varnish -g varnish -S /etc/varnish/secret -s malloc,512M 我错过了什么吗?是否有不同的方式,whitout设置TTL(我更喜欢)? 解决方法
问题是Varnish在调用vcl_backend_response之前评估Expires后端响应头.结果是传递给vcl_backend_response的对象已经有一个过期的TTL(假设标题有一个过期的日期).下一个客户端请求将在缓存对象上命中,但是由于对象已过期(HIT-FOR-PASS),因此会丢失.是的,你没有设置Expires标头(通过unset beresp.http.expires;),但它已经太晚了.
现在无论这是一个bug,还是Varnish开发人员对RFC的解释我都不确定. 我知道您的代码可能仅用于测试目的,但最好不要在VCL中与缓存标头作斗争.使用适当的值(public,private,nocache)调用PHP的session_cache_limiter(),或者禁用它(session_cache_limiter(”))并自己控制头文件. 如果您正在使用PHP会话,您仍然必须处理cookie标头使其无法缓存,但那是超出问题范围的另一个问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |