我如何在Node.js中支持多个版本

我有一个网站,需要一直在上升。 当然,我也需要做新的发布。 每个页面往往是非常长寿的,大量的JavaScript对服务器进行AJAX调用。

我所做的是构build一个新的WAR文件,并将其放在Tomcat的webapps目录中,结果如下所示:

20110701-7f077d 20110711-aa8db4 20110715-6f4a12 20110701-7f077d.war 20110711-aa8db4.war 20110715-6f4a12.war live 

战争文件是以其发布date和GIT commit-id的前几个字符命名的,所以我可以跟踪一切。 Tomcat会自动将war文件解包成一个同名的目录。 直播直播只包含一个文件,给出“现场”版本的名称。

这样,每个用户都可以继续使用与他加载到浏览器中的前端版本配合使用的后端版本。 显然,版本升级和回复是无痛的。

现在,我正在切换到node.js,我想要做同样的事情。 我可靠地通知 node.js在一个实例中不支持独立的应用程序。 那么该怎么办?

我唯一能做的就是指定n个插槽(其中n是一些小数字,如10或100),每个插槽对应一个端口(即插槽1是8001等等),把Apache放在几个node.js实例,每个代表一个插槽,Apache将使用mod_proxymod_redirect来代理请求,例如“/ slot01”到端口8081.“live”将指向当前插槽。

这将是笨拙和容易出错,需要一个否则无用的Apache实例,最重要的是, 我不能相信node.js没有一个好的解决scheme似乎是一个近乎普遍的问题

您可以使用node-http-proxy并编写一些代码来监视您的“部署目录”中的新版本,当发现这样的版本时,您可以启动相应的脚本并在目录名称下进行代理(如果您发现新的目录“version-11-today”,你的父节点-http-proxy脚本可以启动新的脚本,为它分配一个作为parameter passing的端口,然后在path“/ version-11-today”下代理新的应用程序。

只有在这种情况下,才能使用nginx来实现类似的解决scheme,您可以编写脚本来监视部署目录,并在find新应用程序时生成一些新的nginxconfiguration。

如果您担心可能会用尽端口,我相信node.js和nginx都可以在inet套接字上运行并代理unix套接字。

上述优点是,每个应用程序运行在自己的过程中,保护其他应用程序免受崩溃,并使应用程序重新启动。

第三个解决scheme,如果你不害怕一些错误会导致你的应用程序崩溃,有一个父脚本,在同一个进程中加载​​所有的应用程序版本,并根据它们被发现的目录将它们映射到不同的path。你仍然可以重新启动服务器没有停机时间,例如在这个例子http://codegremlins.com/28/Graceful-restart-without-downtime