当上游服务器再次被代理时,Nginx健康检查是否有效



我有以下Nginx设置:


# nginx load balancer
upstream web_app {
server localhost:7021; # nginx1
server localhost:7031; # nginx2
}
server {
listen 7777 ssl;
server_name localhost 0.0.0.0;;
client_max_body_size 25m;
gzip on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/javascript application/xml;
gzip_disable "MSIE [1-6].";
location / {
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_set_header   X-Forwarded-Proto $scheme;
proxy_set_header   Host             $http_host;
proxy_pass https://web_app;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_connect_timeout 600s;
send_timeout 600s;
}
}

# nginx1
server {
listen 7021 ssl;
server_name localhost 0.0.0.0;

client_max_body_size 25m;
gzip on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/javascript application/xml;
gzip_disable "MSIE [1-6].";
location / {
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_set_header   X-Forwarded-Proto $scheme;
proxy_set_header   Host             $host;
proxy_pass http://localhost:7001; # process1
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_connect_timeout 600s;
send_timeout 600s;
}
}

# nginx2
server {
listen 7031 ssl;
server_name localhost 0.0.0.0;

client_max_body_size 25m;
gzip on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/javascript application/xml;
gzip_disable "MSIE [1-6].";
location / {
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_set_header   X-Forwarded-Proto $scheme;
proxy_set_header   Host             $http_host;
proxy_pass http://localhost:7011; # process2
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_connect_timeout 600s;
send_timeout 600s;
}
}

负载平衡器有一个上游组,该组又是Nginx进程每个Nginx进程代理一个应用程序进程

Nginx Load Balancer
/     
/       
Nginx1   Nginx2
|         |
Process1   Process2

这里的问题是,即使其中一个进程没有运行,负载均衡器也会向该上游服务器发送请求,从而导致问题。我认为这是因为Nginx健康检查只对直接上游服务器执行检查,而不对任何代理执行检查。

即。如果process2已停止,则负载平衡器仅检查localhost:7031上Nginx进程的运行状况,而不检查localhost:7301 中的任何代理

我希望在应用程序进程级别进行健康检查,即@localhost:7001和localhost:7011

解决了这个问题。健康检查并没有像我预期的那样进行,因为在我的情况下,应用程序进程返回502。

我必须设置proxy_next_upstream error timeout http_502处理502

https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream

最终Nginx LB conf

# nginx load balancer
upstream web_app {
server localhost:7021; # nginx1
server localhost:7031; # nginx2
}
server {
listen 7777 ssl;
server_name localhost 0.0.0.0;;
client_max_body_size 25m;
gzip on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/javascript application/xml;
gzip_disable "MSIE [1-6].";
location / {
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_set_header   X-Forwarded-Proto $scheme;
proxy_set_header   Host             $http_host;
proxy_pass https://web_app;
proxy_next_upstream error timeout http_502;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_connect_timeout 600s;
send_timeout 600s;
}
}

最新更新