Varnish 仅缓存来自单个会话的资产

Varnish 仅缓存来自单个会话的资产

目前我设法配置 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 客户端标头。

相关内容