![Varnish 仅缓存来自单个会话的资产](https://linux22.com/image/577127/Varnish%20%E4%BB%85%E7%BC%93%E5%AD%98%E6%9D%A5%E8%87%AA%E5%8D%95%E4%B8%AA%E4%BC%9A%E8%AF%9D%E7%9A%84%E8%B5%84%E4%BA%A7.png)
目前我设法配置 varnish 来缓存来自 1 个用户的项目,但是当第二个用户进入时,varnish 会从 Apache 获取另一项资产。
如何在 magento 后面缓存可供多个用户访问的静态资产(css、js、图像 pdf 等)?
在 vcl_recv 上,我已经配置:
if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
unset req.http.Https;
unset req.http.Cookie;
return (lookup);
}
在 vcl_fetch 上:
if (beresp.status == 200 || beresp.status == 301 || beresp.status == 404) {
if (beresp.http.Content-Type ~ "text/html" || beresp.http.Content-Type ~ "text/xml")
{
# do something
} else {
unset beresp.http.expires;
unset beresp.http.set-cookie;
set beresp.ttl = 300h;
}
我怀疑这与使用某种客户端指纹存储缓存的 vcl_hash 有关。
有没有办法可以操纵仅针对特定资产类型的哈希方式?
编辑1:完整配置:http://pastebin.com/mzSVpEqN
答案1
正如评论中所述,注释掉该vcl_hash
功能(假设您不需要它用于其他任何用途)并且希望您看到改进。
呼呼!
答案2
我找到了解决这个问题的方法。
Varnish 为每个特定的 User-Agent 存储不同的缓存页面。我发现了以下技术来规范用户代理(https://www.varnish-cache.org/trac/wiki/VCLExampleNormalizeUserAgent)
我把所有东西都放进一个篮子里,发现点击次数大幅增加。
在 vcl_recv 上:
if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
set req.http.user-agent = "Mozilla";
unset req.http.Https;
unset req.http.cookie;
return (lookup);
}
答案3
Varnish 将遵守来自后端的 Vary 标头。除非后端发送 Vary: User-Agent,否则无需规范化 User-Agent 客户端标头。