这可能是一个基本问题,但我如何有效地为当前运行的node.js代码部署更新?
我来自PHP,JavaScript(客户端)背景,我可以在需要更新时覆盖文件,并且生产网站上的更改立即可用。
但是在node.js中,我必须覆盖现有文件,然后关闭并重新启动应用程序。我应该担心这可能造成的停机吗?对我来说,它似乎比PHP(脚本)方式更危险。除非我有一个服务器集群,否则我可以一次取下一台服务器进行更新。
可以采用哪种策略?
答案 0 :(得分:2)
我不会太担心停机时间,你应该能够保持这么短,以至于没有人会注意到这个机会(杀死进程并在bash脚本中重新启动它或者如果你想保留它的话到几分之一秒。)
然而,更令人担忧的是,许多Node应用程序会在内存中保留大量状态信息,当您重新启动它时,它们将丢失。例如,如果您正在运行聊天应用程序,则可能无法记住用户与谁通话或者他们所处的频道/房间。处理此问题更多是设计问题,而且非常特定于应用程序。
答案 1 :(得分:2)
就我而言,它几乎是:
svn up; monit restart node
此节点服务器充当具有长轮询客户端的彗星服务器,因此客户端只需像往常一样重新连接。 Node服务器所做的第一件事就是从数据库中获取当前状态信息,这样一切都可以很快顺利运行。
我认为这不比冒svn up
更新一堆PHP文件更冒险。如果有什么它有点安全。当你正在更新一个大的php项目时,有机会(如果它是一个高流量站点,它基本上是100%的机会),你可以通过Web服务器获得请求,而你还在更新。这意味着您将在同一请求中运行更新和过时的代码。至少使用Node方法,您可以更新所有内容并重新启动Node服务器并知道您的所有代码都是最新的。
答案 2 :(得分:1)
某些云托管提供商Node.js(如NodeJitsu或Windows Azure)将您网站的两个版本都保存在不同目录上的磁盘上,只需在新版本完全部署后将流量从一个版本重定向到新版本。
这通常是平台即服务(PaaS)提供商的内置功能。但是,如果您正在管理服务器,则需要构建一些内容,以便在完全部署新版本后允许流量从一个版本转移到另一个版本。
这种方法的一个优点是,回滚很容易,因为以前的版本完好无损地保留在网站上。
答案 3 :(得分:1)
如果您的node.js应用程序无法跳过节拍'这意味着它不断受到传入请求的轰炸,你只是无法承受快速重启的停机时间(即使使用nodemon)。我认为在某些情况下,您只需要无缝重启node.js应用程序。 要做到这一点,我使用naught:https://github.com/superjoe30/naught 使用内置集群API
为您的Node.js服务器实现零停机部署