当源站宕机时(Nginx,502),在重试之间添加延迟。

3
基本上是这样的情况。在nginx后面有一个node应用程序,当我重新启动应用程序时,我希望nginx延迟响应,并在之间进行一些延迟的请求重试几次。我找到的所有内容都只会立即重试N次,但显然在应用程序由于重新启动而关闭时,这并不有用,这是我的用例。有什么办法吗?我甚至不关心它有多么hacky /如果有的话,我只需要一个解决方案,不要启动第二个应用程序实例,并在第二个应用程序启动时杀死第一个应用程序。谢谢!

请发布您目前使用的配置。 - Tarun Lalwani
2个回答

0

您可以将同一服务器添加为多个上游服务器,并配置proxy_next_upstreamproxy_next_upstream_timeoutproxy_next_upstream_tries选项。参考

    upstream node_servers {
        server 127.0.0.1:12005;
        server 127.0.0.1:12005;
    }

    ...

    proxy_next_upstream http_502;
    proxy_next_upstream_timeout 60;
    proxy_next_upstream_tries 3;  

然而,我建议您使用像pm2这样支持优雅重载/重启的进程管理器。如果您在集群模式下使用多个CPU来运行您的nodejs服务器,这些进程管理器将非常有用。

1
我已经尝试了这种方法,问题是当应用程序宕机时,nginx完全忽略了我设置的任何延迟,因此端口未被使用,它会立即尝试我定义的所有上游。我现在的做法是创建了一个作为反向代理的第二个节点应用程序,并设置它为第二个上游。这样,当应用程序本身关闭时,“备份”应用程序将尝试请求它,直到它恢复正常,然后返回结果。不确定这是否愚蠢还是天才,但它确实完全符合我的需求 ¯\(ツ) - Kinsi
1
五年过去了,问题仍然存在。顺便说一下,pm2--watch模式下似乎没有优雅的重载,这似乎是一个常见的使用情况。只有突然重新启动。 - Bean Taxi

0

你可以使用一个模块:

https://www.nginx.com/resources/wiki/modules/echo

基本上,您在server_one上游提供常规请求;如果它失败并返回502错误码,则拦截代码,然后将请求传递给@delay,它等待5秒钟(在此示例中),然后再次将请求传递给@delayed,后者将其传递给server_two上游。

upstream server_one {
    server 172.16.0.1;
}
 
upstream server_two {
    server 172.16.0.2;
}

server {
    location / {
        proxy_pass http://server_one;
        proxy_intercept_errors on;
        error_page 502 @delay;
    }
 
    location @delay {
        echo_sleep 5; // sleep here
        echo_exec @delayed;
    }

    location @delayed {
        proxy_pass http://server_two;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接