NGINX: Повторить proxy_pass в течение определенного периода времени при отказе в соединении от вышестоящего сервера

NGINX: Повторить proxy_pass в течение определенного периода времени при отказе в соединении от вышестоящего сервера

Я использую 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. Отрегулируйте тайм-ауты в соответствии с вашими конкретными требованиями.

Связанный контент