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


16

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

Answers:


5

我发现如果您指定同一后端的数百个实例,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响应为止。即重试无限次数(?),延迟为零秒。

我现在回到我的填充单元...


第二种方法是否会导致递归循环并使服务器崩溃?
Seun Osewa'3

@SeunOsewa它的确很大程度上取决于后端响应需要多长时间,但是,在某些时候,这会溢出。
奥利(Oli)2012年

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;

要将lua模块安装到ubuntu 17.04上的nginx上,请运行:sudo apt-get install libnginx-mod-http-lua
Eugene Mala

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.