有一些博客文章和问题涉及此问题,但它们大多来自 2010 年或 2011 年,我希望得到一个更加最新的(2014 年时代)的答案。
我有一个非常标准的 Node.JS 应用程序,运行 Express、Socket.IO、Passenger 等。我的生产服务器运行的是 Ubuntu Server 12.04 LTS。从高层次来看,我的部署工作流程大致如下:
- 使用以下方式将更新后的代码推送/拉取到我的生产服务器git
- 如有必要,运行任何构建脚本和/或安装新的依赖项
- 使用重启应用程序
forever restart
Node.JS 应用程序在端口 8080 上运行,并且我得到了iptables设置将端口 80 流量转发到 Node 应用程序。
此设置存在一些问题。最严重的问题是服务中断。由于我的应用程序使用的是 WebSockets,因此每当永远重新启动服务器后,所有已连接的用户都会丢失其 WebSockets 会话。Socket.IO 会自动重新连接用户,但用户的会话信息不会转移到新的服务器实例。另一个问题是错误处理。如果 Node.JS 服务器遇到未处理的异常(这是一个不幸的现实),永远终止并重新启动服务器,再次导致所有用户丢失他们的 WebSockets 会话。
使用 PHP 和 Apache 等更传统的技术部署的服务器不会出现此问题,因为(如果我理解正确的话)每个连接都在其自己的线程中运行,因此新的部署不会影响当前活跃的用户,并且 PHP 中的异常只会破坏一个用户的会话,而不是关闭所有人的服务器。
那么,如何在不中断服务的情况下部署 Node.JS,以便它可以保留每个用户的会话?