NGINX: Tente novamente proxy_pass por um período de tempo na conexão recusada do upstream

NGINX: Tente novamente proxy_pass por um período de tempo na conexão recusada do upstream

Estou executando o NGINX 1.25.3 com o seguinte arquivo de configuração que funciona bem, desde que os servidores FCGI upstream estejam aceitando conexões e respondendo 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/;
        }
}

No entanto, se meus ouvintes FCGI upstream precisarem ser reiniciados, eles levarão cerca de 15 segundos para começar a aceitar conexões novamente. Durante esta janela, o NGINX retornará instantaneamente o erro HTTP 502 ao cliente, que é o comportamento que espero alterar.

O que eu gostaria que acontecesse é que o NGINX continuasse tentando se conectar ao(s) servidor(es) upstream FCGI por até 20 segundos antes de retornar o erro 502.

Eu tentei inúmeras variações, como:

proxy_next_upstream error;
proxy_connect_timeout 2s;

e

proxy_next_upstream error;
proxy_connect_timeout 2s;
proxy_next_upstream_timeout 30s;

e

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;
}

Mas em todos os casos, o cliente recebe uma resposta 502 instantânea quando os servidores FCGI upstream recusam conexões.

Existe uma maneira de configurar o NGINX para se comportar de forma que ele tente novamente conexões upstream repetidamente por até X segundos, retornando o erro 502 apenas se não conseguir se conectar dentro desse período de tempo?

Responder1

Para configurar o NGINX para tentar novamente conexões upstream por um período especificado antes de retornar um erro 502, você pode usar as diretivas proxy_next_upstream e proxy_connect_timeout. Abaixo está uma configuração atualizada que deve atingir o comportamento desejado:

por favor use este código

backend_nomad_internal2 {servidor 127.0.0.1:42250; servidor 127.0.0.1:42251; servidor 127.0.0.1:42252; }

servidor {ouvir 443 ssl; http2 ativado; nome_servidor 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/;
}

}

Nesta configuração:

-> proxy_connect_timeout 2s;: Define o tempo limite para estabelecer uma conexão com o servidor upstream para 2 segundos.

-> tempo limite de erro proxy_next_upstream http_500 http_502 http_503 http_504;: Especifica as condições sob as quais o NGINX deve tentar o próximo servidor upstream. Neste caso, inclui erros e tempos limite.

-> proxy_timeout 20s;: Define o tempo máximo permitido entre o estabelecimento de uma conexão e o recebimento da resposta do servidor upstream. Neste caso, está definido para 20 segundos.

Com essas configurações, o NGINX tentará se conectar aos servidores upstream por até 20 segundos, tentando novamente se necessário, antes de retornar um erro 502 ao cliente. Ajuste os tempos limite com base em seus requisitos específicos.

informação relacionada