Varnish 缓存 wordpress 网站,每个用户或 UA(我不确定)。我希望缓存是通用的

Varnish 缓存 wordpress 网站,每个用户或 UA(我不确定)。我希望缓存是通用的

我最近将一个网站从通用 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;
   }
   # ...
}

相关内容