我有一个依赖于会话和cookie的网站。我想在它上面实现Varnish缓存。
当浏览器打开时,网站会有相同的会话ID,直到浏览器关闭。但标题中的 AGE 值仍为 0 。此AGE值描述清漆是否缓存页面。 0表示不缓存。
要检查Varnish缓存是否有效, curl -I domainname
是命令,我通过终端点击此标题,标题提供不同的PHPSESSIONID 每个HIT和AGE的值也保持为0.
无法准确确定哪些内容不允许网站被Varnish缓存。
只是为了测试我 commented the session_start()
,以下是观察结果。
在浏览器上
在终端
似乎Varnish无法缓存浏览器点击量。特别是在指定Domain时。
任何帮助如何让varnish缓存适用于基于会话的网站?
答案 0 :(得分:0)
Varnish默认不会缓存设置Cookie的网页。有两种方法可以解决这个问题:
从页面中删除Cookie。如果页面首先不需要会话(即它没有特定于用户的内容),这仅适用于您。你可以这样做:
// ... default.vcl
sub vcl_recv {
unset req.http.Cookie;
return(hash);
}
将cookie添加到Varnish生成的哈希值中,这意味着每个会话都会拥有它自己的个人缓存(它仍然会带来性能提升,但远没有像你一样显着可以选择1.如此:
// ... default.vcl
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
hash_data(req.http.Cookie);
return(lookup);
}
您可能有一些页面似乎没有特定于用户的内容(比如说您有博客,博客文章不需要特定于用户的内容)但您可能有一些内容表明是否用户已登录。如果您可以通过AJAX将其发生到非缓存或每会话缓存端点,那么它将全部正常工作。
使用选项2,您可能会发现需要将Cookie临时存储在另一个标题中,以便Varnish实际缓存页面,您可以这样做:
// ... default.vcl
sub vcl_recv {
set req.http.X-Cookie = req.http.Cookie;
unset req.http.Cookie;
return(hash);
}
然后只需更改vcl_hash
函数即可使用req.http.X-Cookie
代替req.http.Cookie
。