我是Varnish的新手,我很难理解为什么这么多请求都是miss
或hit_for_pass
。
我在vcl_recv
中添加了unset req.http.Cookie;
(如果我是对的),以有效地忽略所有cookie并缓存,而不管cookie如何?这是对的吗?
但尽管如此,我仍然没有得到hits
。因此,这种cookie方法要么是错误的,要么是完全不同的原因导致它不起作用。
对此有什么想法,或者有没有办法确切地了解我为什么如此频繁地得到hit_for_pass
或miss
。
谢谢Jake
编辑
再谷歌一下,我发现了这个
sub vcl_fetch {
unset beresp.http.set-cookie;
}
所以我想这会从响应对象中删除cookie,有人能解释为什么现在这样做了吗?我做了什么让它工作?
EDIT2
再看一眼varnishstat
,就会发现它并没有像我预期的那样工作,而且我仍然有很多失误。
如果您得到了很多hit_for_pass
决策,那么缓存中的决策也很少,因此会出现未命中。
我相信hit_for_pass
只是从vcl_fetch
方法抛出的,所以值得一看您的服务器返回了什么。需要考虑的事项包括:
-
remove beresp.http.Cache-Control;
和remove beresp.http.Pragma;
以阻止后端应用程序阻止缓存。 -
remove beresp.http.Expires;
以避免现在/过去的到期日期(您可能希望根据您提供的服务将其更改为遥远的未来到期日期)。 -
如果您的应用程序不提供cookie,那么
remove beresp.http.Set-Cookie;
将对您的hit_for_pass率产生重大影响。 -
确保设置了适当的
beresp.ttl
值。
我还建议您阅读这篇关于"Accept-Encoding"标头的文章(示例中的代码位于vcl_recv
方法中)。
对于其他可能有此问题的人来说,这很有用。
https://www.varnish-cache.org/trac/wiki/VCLExampleHitMissHeader
设置标头以显示缓存的内容和未缓存的内容以及原因。