如何使用 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
后端仅用于轮询。
我有一个位于 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
后端仅用于轮询。