基本上是这样的情况。在nginx后面有一个node应用程序,当我重新启动应用程序时,我希望nginx延迟响应,并在之间进行一些延迟的请求重试几次。我找到的所有内容都只会立即重试N次,但显然在应用程序由于重新启动而关闭时,这并不有用,这是我的用例。有什么办法吗?我甚至不关心它有多么hacky /如果有的话,我只需要一个解决方案,不要启动第二个应用程序实例,并在第二个应用程序启动时杀死第一个应用程序。谢谢!
您可以将同一服务器添加为多个上游服务器,并配置proxy_next_upstream
、proxy_next_upstream_timeout
和proxy_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服务器,这些进程管理器将非常有用。pm2
在--watch
模式下似乎没有优雅的重载,这似乎是一个常见的使用情况。只有突然重新启动。 - Bean Taxi你可以使用一个模块:
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;
}
}