我在用着stale-if-error
在服务器被标记为不健康的情况下提供过时的内容grace
and keep
中的对象选项vcl_hit
.
问题是:进入vcl子程序后是否可以传递一个缓存对象vcl_backend_error
(新请求错误)。实际上,我在以下位置交付缓存对象vcl_hit
但看下一张图,我不明白如何访问该请求的缓存对象。
Source: 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);
}
If vcl_backend_error
由后台/异步后端获取触发return (deliver)
during vcl_hit
你不用担心。它只是一个更新停滞对象的后台线程。停滞的内容已经交付给客户。
If vcl_backend_error
由触发的同步后端获取到达return (fetch)
during 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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)