【发布时间】:2015-07-24 16:09:03
【问题描述】:
我正在努力理解清漆的行为,并希望有人能提供一些启示。
我正在做一个测试,我正在尝试使用 varnish 来缓存带有 cookie 的请求/响应。
我有一个非常简单的 PHP 脚本,它可以简单地启动一个会话。
<?php session_start(); ?>
我确实希望清漆不会因为 Set-Cookie 和 Cookie 标头而缓存。
我会去取消设置这些标题:
sub vcl_backend_response {
unset beresp.http.set-cookie;
}
sub vcl_recv {
unset req.http.cookie;
}
请求的页面仍然没有被缓存。
我知道 PHP 会发送一个缓存清除标头,这可能会受到清漆的尊重。让我们检查一下:
<?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;
}
此时我希望清漆能够缓存,但仍然没有缓存。
有效的解决方法是设置一个 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
我错过了什么吗?有没有不同的方法,不设置 TTL(我更喜欢)?
【问题讨论】: