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,以及两种情况:
- 在常规浏览器选项卡上命中缓存的那个
- 在隐身模式下或从不同的浏览器中导致缓存未命中的那个
日志将提供更多上下文并解释所发生的事情。
这就是我的 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,以及两种情况:
- 在常规浏览器选项卡上命中缓存的那个
- 在隐身模式下或从不同的浏览器中导致缓存未命中的那个
日志将提供更多上下文并解释所发生的事情。