部署更新到生产环境的Node.js代码

5
这可能是一个基本的问题,但我该如何有效地部署更新到正在运行的node.js代码呢?
我来自于PHP、JavaScript(客户端)背景,在这些语言中,当需要更新时,我只需要覆盖文件,更改将立即在生产站点上生效。
但是,在node.js中,我必须覆盖现有文件,然后关闭再重新启动应用程序。我应该担心潜在的停机时间吗?对我来说,这似乎比PHP(脚本)方式更冒险。除非我有一个服务器集群,可以逐个关闭服务器进行更新。
有哪些可用的策略呢?
4个回答

2
如果你的node.js应用程序“不能跳过一个拍子”,也就是说,它正在不断地接收请求,那么即使使用nodemon,你也无法承受快速重启的停机时间。在某些情况下,你可能只需要无缝重启你的node.js应用程序。 为了做到这一点,我使用naught:https://github.com/superjoe30/naught 使用内置的集群API实现Node.js服务器的零停机部署。

2

我不太担心停机时间,您应该能够将其缩短到很短的时间,以至于没有人会注意到(如果您想将其缩短到几分之一秒,则可以在bash脚本中终止进程并重新启动它)。

然而,更值得关注的是,许多Node应用程序在内存中保留了大量状态信息,当您重新启动时,您将失去这些信息。例如,如果您正在运行聊天应用程序,则可能无法记住用户正在与谁交谈或他们在哪个频道/房间中。解决这个问题更多地涉及设计问题,并且非常特定于应用程序。


是的。这就是为什么将会话数据存储在持久数据库而不是内存中是有意义的原因。 - Juho Vepsäläinen

2

在我的情况下,这非常简单:

svn up; monit restart node

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

我认为这并不比更新一堆PHP文件的svn up更危险。如果说有什么区别的话,那么Node方式会更安全一些。当你更新一个大型php项目时,有可能(如果它是高流量站点,基本上是100%的几率)在你仍在更新时就会收到Web服务器的请求。这意味着您将在同一请求中运行更新和过时的代码。至少使用Node方法,您可以更新所有内容并重新启动Node服务器,以确保所有代码都是最新的。


1

一些云托管提供商(如NodeJitsu或Windows Azure)会在磁盘上的不同目录中保留您网站的两个版本,并在新版本完全部署后将流量从一个版本重定向到新版本。

这通常是平台即服务(PaaS)提供商的内置功能。但是,如果您正在管理自己的服务器,则需要构建某些内容,以允许流量从一个版本转移到下一个版本,一旦新版本已完全部署。

这种方法的优点是回滚很容易,因为先前的版本仍然完整地保留在网站上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接