是否可以查询 Varnish 控制器所包含的健康后端的数量?

是否可以查询 Varnish 控制器所包含的健康后端的数量?

具体来说,在 Varnish 3 中,有没有办法检查导演是否有任何健康的后端?

我的用例是,我有一个负载均衡器,它将流量分发到 2 个 Varnish 盒,而这两个 Varnish 盒又位于多个 Web 服务器的前面。如果控制器至少有一个健康的后端,我希望 Varnish 向负载均衡器的健康检查返回 200,而不依赖于将请求传递到实际的后端。

我正在寻找类似的东西:

if (req.url ~ "healthcheck.html") {
    if (my_director.has_healthy_backend) {
        return 200
    } else {
        error 500 "No backends available"
    }
}

答案1

最重要的是,您已为 Director 设置了探测功能,因此它实际上具有后端的健康状态。如果是这种情况,那么您可以使用类似下面的方法:

sub vcl_recv {
    if (req.url ~ "healthcheck.html") {
        if (!req.backend.healthy) {
            error 503 "No backends available";
        } else {
            error 200 "All is well";
        }
    }
    [...rest of your logic...]

答案2

等效的 Varnish 4 解决方案是:

if (req.url ~ "healthcheck.html") {
  if (!std.healthy(req.backend_hint)) {
    return (synth (503, "No backends available"));
  }
  else {
    return (synth (200, "All is well"));
  }
}

相关内容