将更新部署到生产node.js代码

这可能是一个基本的问题,但我该如何有效地部署更新到当前正在运行的node.js代码?

我来自一个PHP,JavaScript(客户端)背景,我可以在需要更新时覆盖文件,产品网站上即时提供这些更改。

但是在node.js中,我必须覆盖现有的文件,然后closures并重新启动应用程序。 我应该担心潜在的停机时间吗? 对我来说,这似乎是比PHP(脚本)方式更危险的方法。 除非我有一个服务器集群,我可以一次取下一台服务器进行更新。

什么样的策略可用于此?

在我的情况下,这是非常多的:

svn up; monit restart node

这个节点服务器充当一个长轮询客户端的彗星服务器,因此客户端就像通常那样重新连接。 Node服务器做的第一件事就是从数据库中获取当前的状态信息,所以一切都很顺利。

我不认为这是比svn up更新一堆PHP文件更高的风险。 如果有什么更安全的话 当你更新一个大的PHP项目时,有一个机会(如果它是一个高stream量的网站,基本上有100%的机会),你可以通过networking服务器获取请求,而你还在更新。 这意味着您将在同一个请求中运行更新和过期的代码。 至less通过Node方法,您可以更新所有内容并重新启动节点服务器,并知道您的所有代码都是最新的。

我不会担心太多的停机时间,你应该能够保持这么短的几率,没有人会注意到(杀死进程,并重新启动它在一个bash脚本或一些东西,如果你想保持它的分数一秒钟)。

然而,更令人担忧的是,许多节点应用程序在内存中保存了大量的状态信息,当您重新启动时,它们将会丢失。 例如,如果您正在运行聊天应用程序,则可能不记得用户正在与谁聊天,或者他们在哪个频道/房间。处理这个问题更多的是devise问题,而且是非常特定的应用程序。

某些云托pipe提供商Node.js(如NodeJitsu或Windows Azure)会将您站点的两个版本都保留在磁盘上的不同目录中,并且只要新版本完全部署,就将stream量从一个版本redirect到新版本。

这通常是平台即服务(PaaS)提供商的内置function。 但是,如果您要pipe理服务器,则需要构build一些function,以便在新服务器完全部署后,stream量将从一个版本迁移到另一个版本。

这种方法的一个优点就是回滚起来很简单,因为以前的版本仍然保留在网站上。

如果你的node.js应用程序'不能跳过一个节拍',这意味着它正在连续轰炸传入的请求,你只是不能承受快速重新启动(即使使用nodemon)的停机时间。 我想在某些情况下,您只需要无缝地重新启动node.js应用程序。 为此,我使用naught: https : //github.com/superjoe30/naught使用内置群集API为您的Node.js服务器零宕机部署