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

如何在Node.js中支持多个版本,node.js,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提交id

我有一个网站,需要随时更新。当然,我还需要发布新版本。每个页面都有很长的生命周期,有很多JavaScript对服务器进行AJAX调用

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

20110701-7f077d 20110711-aa8db4 20110715-6f4a12 
20110701-7f077d.war 20110711-aa8db4.war 20110715-6f4a12.war  live
war文件以其发布日期和GIT提交id的前几个字符命名,这样我就可以跟踪所有内容。Tomcat自动将war文件解压到同名目录中。live Direct只包含一个名为“live”版本的文件

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

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

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


这将非常笨拙且容易出错,并且需要一个无用的Apache实例,最重要的是,我不能相信node.js没有一个很好的解决方案来解决一个近乎普遍的问题。

您可以使用node http proxy并编写一些代码来监控“部署目录”中的新版本以及这些版本何时发布发现您可以启动相应的脚本并在目录名下代理它(为了弄清楚您是否找到新目录“version-11-today”,您的父节点http代理脚本可以启动新脚本,为其分配作为参数传递的端口,然后在路径“/version-11-today”下代理新应用程序)

类似的解决方案也可以使用nginx,只有在这种情况下,您可以编写一个脚本来监视部署目录,并在发现新应用时生成一些新的nginx配置

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

上述方法的一个优点是,每个应用程序都在其自己的进程中运行,保护其他应用程序不受崩溃的影响,并允许单个应用程序重新启动


如果你不担心某个bug会使你的应用程序崩溃,第三种解决方案是使用一个父脚本,在同一进程中加载所有应用程序版本,并根据它们所在的目录将它们映射到不同的路径下。您仍然可以在不停机的情况下重新启动服务器,例如在本例中

您可以使用node http proxy并编写一些代码来监视“部署目录”中的新版本,当找到这些版本时,您可以启动相应的脚本并在目录名下代理它(为了让我清楚,如果您找到新目录“version-11-today”,您的父节点http代理脚本可以启动新脚本,为其分配作为参数传递的端口,然后在路径“/version-11-today”下代理新应用程序)

类似的解决方案也可以使用nginx,只有在这种情况下,您可以编写一个脚本来监视部署目录,并在发现新应用时生成一些新的nginx配置

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

上述方法的一个优点是,每个应用程序都在其自己的进程中运行,保护其他应用程序不受崩溃的影响,并允许单个应用程序重新启动


如果您不担心某些bug会使应用程序崩溃,那么第三种解决方案是使用一个父脚本,该脚本在同一进程中加载所有应用程序版本,并根据它们所在的目录将它们映射到不同的路径下。您仍然可以在不停机的情况下重新启动服务器,例如在本例中

将nginx放在node前面。node是v非常轻量级。它不允许您自行热加载或交换。也不允许将节点放在其他节点实例的前面。我大约10分钟前才听说nginx,并认为它是其他东西的错别字。现在我已经做了一些初步阅读,nginx似乎只是Apache的一个更瘦的版本。你是在建议我做我的“坏”吗解决方案,但使用nginx?我建议您使用性能与node相同的成熟http引擎,并将其放在node前面。node.js不够成熟,无法指望它只解决您希望它解决的问题。将nginx放在node前面。node非常轻量级。它不允许您自行热加载或交换。或者将node INFO其他节点实例的nt。我在大约10分钟前才听说nginx,并认为它是对其他东西的拼写错误。现在我已经做了一些初步阅读,nginx似乎只是Apache的一个更瘦的版本。你是建议我做我的“坏”吗解决方案,但使用nginx?我建议您使用一个性能与node一样成熟的http引擎,并将其放在node前面。node.js还不够成熟,无法期望它只解决您希望它解决的问题。对我来说,第一个听起来像是一个天才想法,因为我基本上可以制作任意数量的工作应用程序,采用Apache风格多个worker到任何看起来很忙的版本(因此我可以使用多个内核)。虽然我并不担心端口用尽(我猜100是我需要的worker的实际上限),我也喜欢unix套接字的想法。我不太担心在同一个进程中运行应用程序,因为崩溃以及它们都将位于同一个全局JS命名空间中(尽管可能
require
可以为我解决这个问题…)