【发布时间】:2017-07-04 01:22:52
【问题描述】:
如果后端出现 500 错误,我无法理解 Varnish 的行为。 - 为什么它增加 MAIN.n_object 计数器?我认为它应该只缓存 20 倍并重定向。 - 如果第一个请求以来自后端的 500 响应完成,则对同一 url 的所有后续请求都不会缓存,即使后端开始返回 200 响应。 帮助我理解这个逻辑。
【问题讨论】:
标签: varnish varnish-vcl
如果后端出现 500 错误,我无法理解 Varnish 的行为。 - 为什么它增加 MAIN.n_object 计数器?我认为它应该只缓存 20 倍并重定向。 - 如果第一个请求以来自后端的 500 响应完成,则对同一 url 的所有后续请求都不会缓存,即使后端开始返回 200 响应。 帮助我理解这个逻辑。
【问题讨论】:
标签: varnish varnish-vcl
如果您真的使用默认 VCL,则默认逻辑如您所描述。但是你错过了它确实在一段时间后开始缓存它。通常为 2 分钟。
这是实现hit-for-pass 所必需的 - 我对此的理解如下:默认情况下,Varnish 会将请求堆积到后端,而不是在它们到达时发送以进行优化。当 Varnish 发现某些内容不可缓存(500 状态等)时,它不会进行堆积行为并直接与后端对话(hit-for-pass)。
如果您想减少页面被标记为点击通过的时间,您需要添加一些 VCL。这将确保不运行具有 120s 值的内置 VCL。以下内容会将状态为 500 的页面标记为不可缓存 10 秒:
sub vcl_backend_response {
if (beresp.status == 500) {
set beresp.ttl = 10s;
set beresp.uncacheable = true;
return (deliver);
}
}
【讨论】: