我想要按照以下方式配置 varnish(仍然是版本 3):
如果后端可用,则每个请求都应转到后端,因此不应使用缓存结果。如果后端不可用(因此不健康),我想在第二天使用缓存结果。如果一天后后端仍然不健康,则应显示错误。
我尝试使用宽限机制进行以下配置,但这不起作用:尽管所有请求都会发往后端(因此如果后端可用,则不会缓存答案),但在发生故障的情况下,我会立即收到 Varnish 错误(不可用),而不是 Varnish 使用缓存数据。我做错了什么?
sub vcl_recv {
if (req.backend.healthy) {
# No caching if backend is healthy
set req.grace = 1s;
} else {
# Otherwise accept requests up to 1 day old
set req.grace = 1d;
}
}
sub vcl_fetch {
# Cached requests are not valid at all
set beresp.ttl = 1s;
# Keep requests for ttl + 1 d
set beresp.grace = 1d;
}
答案1
据我所知,这是不可能的。只有缓存的项目才能从 grace 中提供。您可以通过修改 Varnish 来实现,方法是将 C 代码写入 vcl。
Varnish 文档非常详尽,深入研究它们也可能会有帮助: https://www.varnish-cache.org/docs