【问题标题】:Why Varnish stops caching 200 response after 500 error为什么 Varnish 在 500 错误后停止缓存 200 响应
【发布时间】:2017-07-04 01:22:52
【问题描述】:

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

【问题讨论】:

    标签: varnish varnish-vcl


    【解决方案1】:

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

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

    这是实现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);
        }
    }
    

    【讨论】:

    • 你是 100% 正确的!最近自己用计时器测量 - 它的 2 分钟问题期。如果只是在500错误之后,后端又可以了,为什么在这2m过去之前它的响应不能被缓存?
    • 如果后端在 500 错误后 10 秒后正常,如何避免在接下来的 110 秒内一次又一次地获取它?
    • 查看更新的答案。类似的东西应该可以工作(未经测试的代码)。
    • 只能使用delivery可以吗?不改变 ttl 且不可缓存
    • 没有这些,您根本不会将该页面标记为不可缓存,并且 Varnish 将在向后端发送请求的方式中“未优化”(当它收到许多针对同一页面的请求时)跨度>
    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2011-10-27
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多