如何使用 Varnish 和 Nginx 检测后端活性

How to detect backend liveness with Varnish and Nginx

我有一个位于 Web 服务前面的 Nginx 服务器前面的 Varnish 服务器(实际上它们都在 k8s 中并且有多个副本,但这似乎与问题无关)。

在 Varnish 中,我需要检测后端状态,以便我可以控制宽限期的长度并相应地提供过时数据。问题是 Varnish 的后端是 Nginx,因此健康检查是针对 Nginx 本身而不是针对底层服务。

当然,这导致的问题是,如果实际服务出现故障,Nginx 仍在工作,而 Varnish 认为世界一切都很好,因此拒绝延长宽限期。

关于如何摆脱这个难题的任何想法?我一直试图让 nginx 暴露底层服务的健康问题,但无济于事。

谢谢

可以为您的原始 Web 应用程序定义一个额外的后端,并对其进行健康探测。

通过std.healthy()可以判断是否健康,并据此调整宽限度。

这是一个 VCL 示例:

vcl 4.1;
import std;

probe health {
    .url = "/healthz";
}

backend proxy {
    .host = "proxy.example.com";
    .port = "80";
    .probe = health;
}
backend webapp {
    .host = "webapp.example.com";
    .port = "80";
    .probe = health;
}

sub vcl_recv {
    if(std.healthy(webapp)){
        set req.grace= 10s;
    } 
}

sub vcl_backend_response {
     set beresp.grace = 24h;
}

此示例将设置 24 小时的标准宽限期,但如果后端健康,它强制执行的宽限期仅为 10 秒。

默认选择proxy后端,因为它是最先定义的。 webapp 后端仅用于轮询。