![Varnish 缓存 wordpress 网站,每个用户或 UA(我不确定)。我希望缓存是通用的](https://linux22.com/image/621875/Varnish%20%E7%BC%93%E5%AD%98%20wordpress%20%E7%BD%91%E7%AB%99%EF%BC%8C%E6%AF%8F%E4%B8%AA%E7%94%A8%E6%88%B7%E6%88%96%20UA%EF%BC%88%E6%88%91%E4%B8%8D%E7%A1%AE%E5%AE%9A%EF%BC%89%E3%80%82%E6%88%91%E5%B8%8C%E6%9C%9B%E7%BC%93%E5%AD%98%E6%98%AF%E9%80%9A%E7%94%A8%E7%9A%84.png)
我最近将一个网站从通用 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;
}
# ...
}