如何在Node.js中实现零停机重新部署

时间:2015-12-24 09:05:15

标签: node.js deployment gulp forever pm2

为Node.js应用程序实现零停机的最简单方法是什么?

我有一个应用程序需要以下步骤进行重新部署:

  • npm install
  • node_modules/.bin/bower install
  • node_modules/.bin/gulp

这些操作的结果是由名为gulpfile.js的{​​{1}}目录生成的准备运行的应用程序。在这个目录中,我有一个当前运行的同一个应用程序的实例(目前通过forever启动,如下所示 - build)。

据我所知,通过forever start server.js模块无法实现零停机,所以我决定选择另一种方式来实现。

我看到了pm2,但我发现它非常复杂(如果你感觉不一样,证明我错了)。

我也看到naught但我甚至无法通过forever启动我的应用程序 - 它甚至不能在stdout / stderr中打印任何内容。

我也看到了up-time但我没有理解 - 当我运行应该替换当前正在运行的实例工作的目录中的文件naught start server.js时,它将如何处理这种情况那一刻?

1 个答案:

答案 0 :(得分:2)

关于在构建期间处理替换文件:如果这些文件由Node.js应用程序使用,那么所有更改将在进程重启时应用(因为这些文件被加载到内存中),浏览器前端文件也可以缓存在应用程序内存中实现类似的行为(仅在重新启动或/和缓存失效时应用更改)。

我们在群集模式下使用pm2。

pm2 start app.js -i

上述命令在群集模式下在所有可用CPU核心上启动app.js

零停机重启:

pm2 gracefulReload all

此命令按顺序重新启动所有进程,因此如果有多个进程启动并运行,则在重新启动期间始终至少有一个服务器请求的进程。 如果您只有一个app.js进程,则可以在群集模式下启动它并运行pm2 scale app.js 2(再启动一个进程),然后pm2 gracefulReload all然后pm2 scale app.js 1(删除以前启动的进程) )。

虽然我认为重新启动应用程序不是零停机部署的主要问题,但我们还没有设法处理数据库迁移,因此需要完全应用程序关闭来应用数据库更改。此外,在部署用户获得新版本时,浏览器前端文件可能存在问题,但AJAX请求由旧版本的服务器进程处理,在这种情况下,粘性会话和API版本控制得以解决。