我最近将一个网站从通用 PHP 切换到 wordpress 驱动。除了适应 wp-admin 的规则外,Varnish 前端是相同的。
我发现缓存命中对于我的连接是唯一的,并且对于我和朋友在不同机器上浏览同一网站时,命中次数明显增加。
我尝试改变 vcl_hash 并简化为简单
sub vcl_hash {
set req.hash += req.url;
set req.hash += req.http.host;
}
但缓存服务对于我们双方来说都是独一无二的。这意味着,如果我看到命中数为“10”,那么我朋友的下一次命中理想情况下应该是“11”;但他得到的命中数为“1”,如果他继续刷新页面,命中数将增加到“2”,依此类推
我希望有人能帮我找出为什么会发生这种情况。其他 wordpress 网站似乎也出现了这种情况。我之所以注意到这一点,是因为从基于 php 的转换为 Wordpress 驱动的
答案1
如果您的后端服务器是 Apache + Wordpress,并且您正在使用 mod_deflate,那么请检查其 Vary 标头。
如果 Vary 标头显示“用户代理”或“cookie”,则 Varnish 将根据用户代理进行缓存。您可以在 Apache 中取消设置 Vary(编辑:或在 varnish 中的 vcl_fetch 中,但我还没有尝试过)。我在虚拟主机配置中使用 setEnv 成功了。
setEnv force-no-vary
但是,我注意到此设置将 HTTP 版本更改为 HTTP/1.0。但是,我没有使用 Keep-Alive 等功能,所以这没什么大不了的。我认为,最终,远程客户端会获得 HTTP/1.1,中间是 Varnish(如果我错了,请纠正我)。
如果您正在设置 cookie,那么您可能需要以不同的方式处理它。
答案2
注释掉你的哈希函数(如果你不需要它),然后重试。哈希就是产生命中的原因该请求独有。
答案3
您必须记住,如果您不执行任何return
操作,Varnish 的默认 VCL 将附加到您的自定义 VCL。
因此,就您而言(我认为您使用的是 Varnish 2.x,因为它的语法),您可能没有清理请求 cookie,而默认 VCL 正在对它们进行哈希处理。(最好检查您的完整 VCL 配置和已应用的 default.vcl)
您可以尝试几件事。
添加返回操作
sub vcl_hash {
set req.hash += req.url;
set req.hash += req.http.host;
return (hash);
}
条件哈希
sub vcl_hash {
if ( ! req.url ~ "wp-admin") {
set req.hash += req.url;
set req.hash += req.http.host;
return (hash);
}
}
消毒 Cookie
sub vcl_recv {
# ...
# Before reurning a lookup
if ( ! req.url ~ "wp-admin") {
unset req.http.Cookie;
}
# ...
}