Varnish 6 缺少来自不同浏览器的相同 URL 请求

Varnish 6 missing requests for same URL coming from different browsers

这就是我的 varnish.vcl 的样子。

vcl 4.0;

import directors;
import std;

backend client {
    .host = "service1";
    .port = "80";
}

sub vcl_recv {

    std.log("varnish log info:" + req.http.host);

    # caching pages in client

    set req.backend_hint = client;

    # If request is from conent or for pages remove headers and cache
    if ((req.url ~ "/content/") || (req.url ~ "/cms/api/") || req.url ~ "\.(png|gif|jpg|jpeg|json|ico)$" || (req.url ~ "/_nuxt/") ) {
        unset req.http.Cookie;
        std.log("Cachable request");
    }
    # If request is not from above do not cache and pass to Backend.
    else
    {
        std.log("Non cachable request");
        return (pass);
    }
}


sub vcl_backend_response {
    if ((bereq.url ~ "/content/") || (bereq.url ~ "/cms/api/") || bereq.url ~ "\.(png|gif|jpg|jpeg|json|ico)$" || (bereq.url ~ "/_nuxt/") )
    {
        unset beresp.http.set-cookie;
        set beresp.http.cache-control = "public, max-age=259200";
        set beresp.ttl = 12h;
        return (deliver);
    }

}

# Add some debug info headers when delivering the content:
# X-Cache: if content was served from Varnish or not
# X-Cache-Hits: Number of times the cached page was served
sub vcl_deliver {

        # Was a HIT or a MISS?
        if ( obj.hits > 0 )
        {
                set resp.http.X-Cache-Varnish = "HIT";
        }
        else
        {
                set resp.http.X-Cache-Varnish = "MISS";
        }

        # And add the number of hits in the header:
        set resp.http.X-Cache-Hits = obj.hits;
}

如果我从显示

的同一个浏览器网络选项卡中访问一个页面

X-Cache-Varnish = "HIT";
X-Cache-Hits = ;

假设我从 chrome 热了 10 次,这就是我得到的结果

X-Cache-Varnish = "HIT";
X-Cache-Hits = 9;

9 因为第一个未命中,其余 9 个从缓存中提供。

如果我尝试隐身 window 或其他浏览器,它会从 0 开始获得自己的计数。我想我仍然以某种方式缓存 cookie。我无法确定我错过了什么。

理想情况下,我想删除特定路径的所有 cookie。但不知何故 unset 似乎对我不起作用。

如果您真的想确保缓存这些请求,请确保在 if-statement.

中执行 return(hash);

如果您不 return,built-in VCL 将接管,并继续执行其标准行为。

除此之外,不清楚您的后端是否设置了 Vary header 这可能会影响您的命中率。

与其猜测,我建议我们使用日志来弄清楚。

运行 以下命令跟踪您的请求:

varnishlog -g request -q "ReqUrl ~ '^/content/'"

This statement's VSL Query expression assumes the URL starts with /content. Please adjust accordingly.

请向我发送 varnishlog 的摘录,用于 1 个特定 URL,以及两种情况:

  • 在常规浏览器选项卡上命中缓存的那个
  • 在隐身模式下或从不同的浏览器中导致缓存未命中的那个

日志将提供更多上下文并解释所发生的事情。