Varnish:如何缓存失败,始终询问后端是否健康?

Varnish:如何缓存失败,始终询问后端是否健康?

我想要按照以下方式配置 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

相关内容