
Я использую NGINX 1.25.3 со следующим файлом конфигурации, который работает хорошо при условии, что вышестоящие серверы FCGI принимают соединения и отвечают нормально:
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/;
}
}
Однако, если мои upstream FCGI-слушатели должны быть перезапущены, им потребуется около 15 секунд, чтобы снова начать принимать соединения. В течение этого окна NGINX мгновенно вернет клиенту ошибку HTTP 502, и это поведение я надеюсь изменить.
Вместо этого я хотел бы, чтобы NGINX продолжал попытки подключиться к вышестоящему серверу(ам) FCGI в течение 20 секунд, прежде чем возвращать ошибку 502.
Я перепробовал множество вариантов, таких как:
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;
}
Но во всех случаях клиент получает мгновенный ответ 502, когда вышестоящие серверы FCGI отклоняют соединения.
Есть ли способ настроить 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 error timeout http_500 http_502 http_503 http_504;: Указывает условия, при которых NGINX должен попытаться обратиться к следующему серверу upstream. В этом случае он включает ошибки и тайм-ауты.
-> proxy_timeout 20s;: Устанавливает максимальное время, разрешенное между установлением соединения и получением ответа от вышестоящего сервера. В этом случае оно установлено на 20 секунд.
При таких настройках NGINX будет пытаться подключиться к вышестоящим серверам в течение 20 секунд, при необходимости повторяя попытку, прежде чем вернуть клиенту ошибку 502. Отрегулируйте тайм-ауты в соответствии с вашими конкретными требованиями.