NGINX:当上游拒绝连接时,重试 proxy_pass 一段时间

NGINX:当上游拒绝连接时,重试 proxy_pass 一段时间

我正在运行 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 错误。根据您的特定要求调整超时。

相关内容