我有一个网站,需要一直保持下去。当然,我还需要发布新版本。每个页面的寿命通常都很长,许多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文件解压缩到同名目录中。实时文件直接包含一个给出“实时”版本名称的文件。
这样,每个用户都可以继续使用后端版本,该版本与已加载到浏览器中的前端版本一起使用。显然,版本升级和还原很轻松。
现在,我切换到node.js,我想做同样的事情。我reliably informed那node.js在一个实例中不支持独立的应用程序。那么该怎么办?
我唯一能做的就是指定n个插槽(其中n是一个小数字,例如10或100),每个插槽对应一个端口(即插槽1是8001,依此类推),将Apache放在几个前面每个代表一个插槽的node.js实例,Apache将使用
mod_proxy
或mod_redirect
代理诸如'/ slot01'之类的请求到端口8081。“活动”将指向当前插槽。这将很笨拙且容易出错,并且需要一个否则无用的Apache实例,而且最重要的是,我不敢相信node.js不能很好地解决似乎普遍存在的问题。
最佳答案
您可以使用node-http-proxy并编写一些代码来监视“部署目录”中的新版本,当找到这些版本时,您可以启动相应的脚本并将其代理到目录名称下(如果发现一个新目录'version-11-today',您的父节点-http-proxy脚本可以启动新脚本,为其分配一个作为参数传递的端口,然后在路径'/ version-11-today'下代理到新应用。
仅在这种情况下,可以使用nginx完成类似的解决方案,您可以编写脚本来监视部署目录并在找到新应用时生成一些新的nginx配置。
如果您担心自己的端口可能用完了,我相信node.js和nginx都可以在inet套接字上运行并代理unix套接字。
上面的优点是每个应用程序都在自己的进程中运行,从而保护其他应用程序免于崩溃并启用单个应用程序重新启动。
如果您不担心会导致应用程序崩溃的第三个解决方案,那就是有一个父脚本,该脚本可以在同一进程中加载所有应用程序版本,并将它们映射到不同的路径下,具体取决于它们所在的目录。您仍然可以重新启动没有停机的服务器,例如本例中的http://codegremlins.com/28/Graceful-restart-without-downtime
关于node.js - 我如何在Node.js中支持多个版本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6793733/