为什么Varnish在500错误后停止缓存200响应

时间:2017-07-03 11:59:43

标签: varnish varnish-vcl

如果后端出现500错误,我无法理解Varnish的行为。 - 为什么它增加MAIN.n_object计数器?我认为它应该只缓存20倍并重定向。 - 如果第一个请求从后端完成500响应,则对同一URL的所有后续请求都不缓存,即使后端开始返回200响应。 帮助我理解这个逻辑。

1 个答案:

答案 0 :(得分:1)

如果你真的使用默认的VCL,那么默认逻辑就像你描述的那样。但是你错过了它确实会在一段时间后开始缓存它。通常是2分钟。

  1. Varnish看到500状态 - >与后端进行对话并且不会将页面缓存2分钟
  2. 后来Varnish看到200状态 - > Varnish缓存页面并从缓存中进一步提供。
  3. 这是实现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);
        }
    }