![这段 varnish 代码起什么作用?](https://linux22.com/image/786382/%E8%BF%99%E6%AE%B5%20varnish%20%E4%BB%A3%E7%A0%81%E8%B5%B7%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我在 varnish 配置中有此代码,但不确定它有什么用!此配置是否会缓存我的客户端请求?它有什么问题?
sub vcl_backend_response {
if (beresp.status != 200) {
return (pass);
}
set beresp.http.X-Backend = beresp.backend.name;
unset beresp.http.cookie;
unset beresp.http.Set-Cookie;
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
set beresp.http.Cache-Control = "no-store";
}
set beresp.http.Cache-Control = "no-store";
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
return (pass);
}
return (deliver);
}
答案1
这段 VCL 代码似乎指定了一些何时绕过缓存的规则。但是,它的编写方式不太合理。
绕过缓存
return(pass)
不是在vcl_backend_response
上下文中绕过缓存的正确方法。return(pass)
用于vcl_recv
当传入请求绕过缓存时。
绕过vcl_backend_response
缓存意味着阻止将传入对象存储在缓存中。最佳实践要求您执行set beresp.uncacheable = true
,分配 TTL,然后return(deliver)
。这可确保此对象在一定时间内绕过缓存,直到下一个后端响应满足所需条件。
通过我的启用beresp.uncacheable
,您可以确保对象最终进入等待列表并成为请求合并的候选对象。
删除 Cookie
删除 cookie 通常有助于提高命中率。在后端上下文中,您将删除标头。这在throughSet-Cookie
中可以正确完成,但这是无条件完成的。vcl_backend_response
unset beresp.http.Set-Cookie
这意味着Set-Cookie
不会执行任何操作,这可能会导致不一致的行为。不确定删除这些 cookie 是否需要先决条件。
您还可以通过 删除传入的 cookie 。但运行unset req.http.Cookie
中似乎有一个类似的调用。vcl_backend_response
unset beresp.http.Cookie
这表明Cookie
将收到响应标头。这似乎不太可能。
重写 VCL
这是我在没有任何其他上下文的情况下重写此 VCL 代码的方法:
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "80";
}
sub vcl_recv {
unset req.http.Cookie;
}
sub vcl_backend_response {
if(beresp.status != 200) {
set beresp.ttl = 120s;
set beresp.uncacheable = true;
return(deliver);
}
set beresp.http.X-Backend = beresp.backend.name;
unset beresp.http.Set-Cookie;
set beresp.http.Cache-Control = "no-store";
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
set beresp.ttl = 120s;
set beresp.uncacheable = true;
return(deliver);
}
return (deliver);
}
警告:我不建议将此代码复制/粘贴到您的生产环境中。我感觉在编写此 VCL 时有些偷工减料。由于我没有任何其他背景信息,因此我不建议使用此代码。