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

时间:2011-07-22 17:24:54

标签: node.js

我的网站需要始终 。当然,我也需要做新版本。每个页面往往都是非常长寿的,有很多JavaScript对服务器进行AJAX调用。

我所做的是构建一个新的WAR文件并将其放在Tomcat的webapps目录中,最终看起来像这样:

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

war文件以其发布日期及其GIT commit-id的前几个字符命名,这样我就可以跟踪所有内容。 Tomcat会自动将war文件解压缩到同名目录中。 live直接包含一个文件,给出“实时”版本的名称。

这样,每个用户都可以继续使用后端版本,该版本与他已加载到浏览器中的前端版本一起使用。很明显,版本升级和恢复是无痛的。

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

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

这将是笨拙且容易出错的,并且需要一个无用的Apache实例,而且最重要的是我无法相信node.js没有良好的解决方案似乎是一个近乎普遍的问题

1 个答案:

答案 0 :(得分:1)

您可以使用node-http-proxy并编写一些代码来监控新版本的“部署目录”,当找到这些版本时,您可以启动相应的脚本并在目录名下代理它(如果你发现一个新的目录'今天版本-11-你的父节点-http-proxy脚本可以启动新脚本,为它分配一个作为参数传递的端口,然后代理到路径'/ version-11-下的新应用程序“)。

类似的解决方案只能在nginx中完成,在这种情况下你可以编写一个脚本来监视部署目录,并在找到新的应用程序时生成一些新的nginx配置。

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

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

第三个解决方案,如果您不担心某些错误会导致您的应用崩溃,那就是拥有一个父脚本,可以在同一个进程中加载​​所有应用版本,并根据找到的目录将它们映射到不同的路径中。您可以仍然可以在不停机的情况下重新启动服务器,例如本例http://codegremlins.com/28/Graceful-restart-without-downtime