后端重新启动时,nginx 代理重试

后端重新启动时,nginx 代理重试

Nginx 在后端重新启动时返回 502。如何让 nginx 代理重试 N 次,延迟 M 秒?是否有插件或其他东西?

答案1

我发现,如果你指定了数百个相同后端的实例,Nginx 需要大约 2 秒钟才能耗尽尝试次数:

    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;

(...呃,根据需要重复!)

是的,这是一个可怕的混合体 - 但它确实增加了一定程度的韧性......

更糟糕的是,你可能会使用:

    server  localhost:8080 max_fails=0;     
    server  localhost:80 backup;        

假设 Nginx 在端口 80 上运行,这将尝试不断循环 Nginx 的请求,直到 localhost:8080 响应。即以零秒延迟重试无限次(?)。

我现在要回到我的软垫牢房了……

答案2

如果您的 nginx 安装支持 Lua,那么您可以使用 sleep 方法在客户端上停留一段时间。该操作是非阻塞的,不会锁定工作器。请记住,用户不能无限期地被停留,因为最终可能会发生一些其他与网络相关的套接字/防火墙超时。

server {
    listen 8502;
    location / {
        #25 seconds sleep
        content_by_lua_block {
             ngx.sleep(25); 
             ngx.exit(ngx.HTTP_BAD_GATEWAY);
        }
    }
}

然后,您需要在上游列表中添加上述服务器作为备份来容纳客户端。

upstream backend {
    server 127.0.0.1:3001 fail_timeout=2s; #The backend
    server 127.0.0.1:8502 backup; #Lua holding server in the event backend is restarting
}

这应该包含在您的代理位置规范中:

proxy_read_timeout         30;  #Value must be higher than sleep in Lua
proxy_next_upstream error timeout http_502 http_504;

答案3

我知道的最接近的事情是这个项目,但我从未使用过。我知道有后端检查,也许你想看看它。

相关内容