具体来说,在 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"));
}
}