gpt4 book ai didi

varnish - 在vart 4中获取错误后在 "probe"指示服务器运行不正常之前传递过时的内容

转载 作者:行者123 更新时间:2023-12-03 17:45:06 30 4
gpt4 key购买 nike

我正在使用 stale-if-error 来提供陈旧的内容,而在 grace 中查看 keepvcl_hit 对象选项时,服务器被标记为不健康。

问题是:进入vcl子程序vcl_backend_error后是否可以传递缓存对象(新鲜请求错误)。实际上,我在 vcl_hit 处提供了缓存对象,但查看下图,我看不到如何访问该请求的缓存对象。

https://www.varnish-software.com/book/4.0/chapters/VCL_Basics.html

资料来源:https://www.varnish-software.com/book/4.0/chapters/VCL_Basics.html

最佳答案

使用内置 VCL 时(请参阅下面的代码):

# Built-in 'vcl_hit'.
sub vcl_hit {
if (obj.ttl >= 0s) {
return (deliver);
}

if (obj.ttl + obj.grace > 0s) {
return (deliver);
}

return (fetch);
}
  • 如果在 vcl_backend_error 期间由 return (deliver) 触发的后台/异步后端获取到达 vcl_hit,则无需担心。它只是一个更新停滞对象的后台线程。停滞的内容已经交付给客户端。
  • 如果在 vcl_backend_error 期间由 return (fetch) 触发的同步后端提取到达 vcl_hit,您也不必担心。错误将传递给客户端,但您别无选择。停顿的对象在 Varnish 存储中不可用。

  • 但是,如果您已自定义 vcl_hit 以在后端健康时限制宽限期(请参阅下面的 VCL 示例代码),则在 return (fetch) 期间执行的 vcl_hit 将作为同步后端请求处理。客户端将等待后端响应。如果后端请求到达 vcl_backend_error 并且错误将传递给客户端。停顿的对象在 Varnish 存储中可用(在本例中停顿超过 60 秒),但不会使用它。
    # Customised 'vcl_hit'.
    sub vcl_hit {
    if (obj.ttl >= 0s) {
    return (deliver);
    }

    if (std.healthy(req.backend_hint)) {
    if (obj.ttl + 60s > 0s) {
    return (deliver);
    }
    } else {
    if (obj.ttl + obj.grace > 0s) {
    return (deliver);
    }
    }

    return (fetch);
    }

    如果您想在同步后端获取失败时交付停滞的对象,在这种情况下,您需要一些额外的 VCL 逻辑。这个想法显示在下面的代码中:
    backend fail_be {
    .host = "127.0.0.1";
    .port = "9000";
    .probe = {
    .url = "/give-me-a-non-200-please";
    .interval = 24h;
    .timeout = 1s;
    .window = 1;
    .threshold = 1;
    }
    }

    sub vcl_recv {
    # Force the non-healthy backend in case of restart because of a previous
    # failed backend fetch. This will force serving stalled content using
    # full grace during 'vcl_hit' (if possible).
    if (req.restarts == 0) {
    unset req.http.X-Varnish-Restarted-5xx;
    } else {
    if (req.http.X-Varnish-Restarted-5xx) {
    set req.backend_hint = fail_be;
    }
    }

    # ...
    }

    sub vcl_synth {
    # 503 generated for synchronous client requests when abandoning the
    # backend request (see 'vcl_backend_fetch') and not executing a POST.
    if (resp.status == 503 &&
    req.method != "POST" &&
    !req.http.X-Varnish-Restarted-5xx) {
    set req.http.X-Varnish-Restarted-5xx = "1";
    return (restart);
    }

    # ...
    }

    sub vcl_backend_fetch {
    if (bereq.retries == 0) {
    unset bereq.http.X-Varnish-Backend-5xx;
    } else {
    if (bereq.http.X-Varnish-Backend-5xx) {
    # Jump to 'vcl_synth' with a 503 status code.
    return (abandon);
    }
    }

    # ...
    }

    sub vcl_backend_response {
    if (beresp.status >= 500 && beresp.status < 600) {
    set bereq.http.X-Varnish-Backend-5xx = "1";
    return (retry);
    }

    # ...
    }

    sub vcl_backend_error {
    set bereq.http.X-Varnish-Backend-5xx = "1";
    return (retry);
    }

    关于varnish - 在vart 4中获取错误后在 "probe"指示服务器运行不正常之前传递过时的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32932632/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com