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

Why Varnish stops caching 200 response after 500 error

我无法理解 Varnish 在后端出现 500 错误时的行为。 - 为什么它递增 MAIN.n_object 计数器?我认为它应该只缓存 20x 和重定向。 - 如果第一个请求以来自后端的 500 响应结束,则对相同 url 的所有后续请求不会缓存,即使后端开始 return 200 响应。 帮助我理解这个逻辑。

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

  1. Varnish 看到 500 个状态 -> 与后端对话并且不缓存页面 2 分钟
  2. 稍后 Varnish 看到 200 状态 -> Varnish 缓存页面并从缓存中进一步传送它。

这是实施所必需的 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);
    }
}