背景:
我使用Nginx+NodeJS结构来运行网站。该服务器有相当多的流量,比如300人同时在线。访问各种页面。我使用pm2
来管理我的节点应用程序。
问题:
但是,当我使用pm2 restart xxx
重新启动节点服务器时,在短时间内(如15秒),用户将遇到502
错误。因此,日志中存在"connect()failed(111:Connection rejected)"。
根据SO.上的另一个问题
502坏网关错误通常表明代理(在NodeJS的情况下为Nginx)找不到将流量路由到的目的地。
因此,我猜发生错误的原因是用户请求服务器,而Node还没有为其业务做好准备。所以我的Nginx不能"联系人";我的nodejs,并抛出了一个502错误。
有什么办法解决这个问题吗?
如果您想在重新启动Node.js服务器的同时继续为用户提供服务,则需要第二台Node.js server。更准确地说:
- 重新启动之前,
node myapp.js
正在端口A上运行和侦听。Nginx将流量路由到端口A - 现在你可以启动第二个Node.js服务器,可能是在你的应用程序
node mynewapp.js
的新版本上,它在端口B上侦听。当你这样做的时候,流量仍然路由到端口a - 一旦
node mynewapp.js
启动并运行,就可以切换Nginx,使其将流量路由到端口B - 为端口a上的请求留出一段宽限期,然后可以关闭
node myapp.js
进程
注意这种方法的两个潜在陷阱:
- 端口A上长时间运行的请求将阻止您关闭";旧的";Node.js服务器
- 在Node.js服务器中留下状态的请求(比如在全局Javascript变量中),在切换到其他Node.js server时会丢失该状态。但是(会话)声明您向数据库写入的内容将继续存在