我正在运行 NGINX 1.25.3,并使用以下配置文件,只要上游 FCGI 服务器接受连接并响应 OK,该配置文件就能正常工作:
upstream backend_nomad_internal2 {
# Multiple FCGI listeners defined below
server 127.0.0.1:42250;
server 127.0.0.1:42251;
server 127.0.0.1:42252;
}
server {
listen 443 ssl;
http2 on;
server_name internal2.example.com;
# BUNCH OF ssl_* CONFIG HERE
location ~ \.fcgi$ {
root /usr/share/nginx/html_live/;
fastcgi_keep_conn on;
fastcgi_pass backend_nomad_internal2;
fastcgi_index index.html;
fastcgi_split_path_info ^(.*cgi)(/.*)$;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html_live/;
}
}
但是,如果我的上游 FCGI 监听器需要重新启动,它们需要大约 15 秒才能再次开始接受连接。在此期间,NGINX 将立即向客户端返回 HTTP 错误 502,这是我希望改变的行为。
我希望发生的是,NGINX 在返回错误 502 之前继续尝试连接上游 FCGI 服务器最多 20 秒。
我尝试过很多变化,例如:
proxy_next_upstream error;
proxy_connect_timeout 2s;
和
proxy_next_upstream error;
proxy_connect_timeout 2s;
proxy_next_upstream_timeout 30s;
和
error_page 502 503 504 = @retry;
}
location @retry {
proxy_pass http://backend_nomad_internal2;
proxy_next_upstream_timeout 30s;
proxy_next_upstream error;
proxy_next_upstream_tries 3; # Adjust the number of retries as needed
proxy_connect_timeout 2s;
}
但在所有情况下,当上游 FCGI 服务器拒绝连接时,客户端都会立即收到 502 响应。
有没有办法配置 NGINX,使其以这样的方式运行:重复重试上游连接最多 X 秒,仅当它在该时间段内无法连接时才返回错误 502?
答案1
要将 NGINX 配置为在返回 502 错误之前重试上游连接一段时间,您可以使用 proxy_next_upstream 和 proxy_connect_timeout 指令。以下是更新后的配置,应该可以实现所需的行为:
请使用此代码
上游 backend_nomad_internal2 {服务器 127.0.0.1:42250;服务器 127.0.0.1:42251;服务器 127.0.0.1:42252;}
服务器{监听 443 ssl; http2 开启;服务器名称 internal2.example.com;
# BUNCH OF ssl_* CONFIG HERE
location ~ \.fcgi$ {
root /usr/share/nginx/html_live/;
fastcgi_keep_conn on;
# Use the following directives to control upstream connection behavior
proxy_connect_timeout 2s;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_timeout 20s;
fastcgi_pass backend_nomad_internal2;
fastcgi_index index.html;
fastcgi_split_path_info ^(.*cgi)(/.*)$;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
error_page 500 502 503 504 = @retry;
location @retry {
# Retry the connection for up to 20 seconds
proxy_pass http://backend_nomad_internal2;
proxy_connect_timeout 2s;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_timeout 20s;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html_live/;
}
}
在此配置中:
->proxy_connect_timeout 2s;:设置与上游服务器建立连接的超时时间为2秒。
-> proxy_next_upstream 错误超时 http_500 http_502 http_503 http_504;:指定 NGINX 应尝试下一个上游服务器的条件。在这种情况下,它包括错误和超时。
-> proxy_timeout 20s;:设置从建立连接到收到上游服务器响应之间允许的最大时间。在本例中,设置为 20 秒。
使用这些设置,NGINX 将尝试连接上游服务器长达 20 秒,必要时重试,然后向客户端返回 502 错误。根据您的特定要求调整超时。