如何在不中断服务的情况下部署Node.JS?

有一些博文和关于这方面的问题,但他们大多是从2010年或2011年,我希望有一个更新的(2014年代)的答案。

我有一个相当标准的Node.JS应用程序,运行Express,Socket.IO,Passenger等。我的生产服务器运行Ubuntu Server 12.04 LTS。 在高层次上,我的部署工作stream程大致是:

  1. 推/拉我更新的代码到我的生产服务器使用git
  2. 如有必要,运行任何构build脚本和/或安装新的依赖项
  3. 使用forever restart启动应用程序

Node.JS应用程序在端口8080上运行,并且我已经设置了iptables来将端口80的stream量转发到Node应用程序。

这个设置有一些问题。 最重要的是服务中断。 由于我的应用程序正在使用WebSocket,因此每当永远重新启动服务器时,所有连接的用户都将丢失其WebSockets会话。 Socket.IO会自动重新连接用户,但用户的会话信息不会转移到新的服务器实例。 另一个问题是error handling。 如果Node.JS服务器遇到一个不需要的exception(这是一个不幸的现实), 永远杀死并重新启动服务器,再次导致所有用户失去WebSockets会话。

使用PHP和Apache等传统技术部署的服务器没有这个问题,因为(如果我理解正确),每个连接都在自己的线程中运行,所以新的部署不会影响当前活动的用户,并且PHP只会破坏一个用户的会话,而不是为每个人查杀服务器。

那么,如何在不中断服务的情况下部署Node.JS,从而保持每个用户的会话呢?