Nginx返回502,而后端正在重新启动。 如何让Nginx代理重试N次,延迟M秒? 有没有插件或其他东西?
我知道最近的事情是这个项目 ,但我从来没有用过。 我知道清漆有后台检查,也许你想看看它。
我发现,如果您指定了数百个相同后端的实例,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响应。 即以零秒延迟重试无限次(?)次数。
我现在回到我的软垫细胞….
如果你的nginx安装有Lua支持,那么你可以用睡眠方法在客户端上保留一段时间。 该操作是非阻塞的,不locking工作人员。 请记住,用户不能被无限地保存,因为最终可能会发生一些其他networking相关的套接字/防火墙超时。
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;