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