有什么好主意可以修复重新启动nodejs服务器时出现的"connect()failed(111:Connect



背景:

我使用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时会丢失该状态。但是(会话)声明您向数据库写入的内容将继续存在

最新更新