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

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

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

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

这些操作的结果是由名为buildgulpfile.js目录生成的准备运行的应用程序。 在这个目录中,我有一个相同的应用程序的当前正在运行的实例(目前通过forever start server.js像这样forever start server.js )。

据我所知,通过forever模块不可能达到零停机时间,所以我决定select另一种方式来做到这一点。

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

我也没有看到,但我甚至无法启动我的应用程序通过naught start server.js – 它甚至不打印任何标准输出/标准错误。

我也看到了运行时间,但我没有得到这个想法 – 当我运行gulp应该replace目前正在运行的实例工作的目录中的文件时,它将如何处理情况?

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

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

pm2 start app.js -i

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

零停机重启:

pm2 gracefulReload all

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

虽然我认为应用程序重新启动不是零宕机部署的主要问题,但我们还没有设法处理数据库迁移,因此需要完全closures应用程序来应用数据库更改。 在部署过程中,当用户获得新版本的时候,浏览器前端文件也可能会出现问题,但是AJAX请求是由旧版本的服务器进程处理的,在这种情况下,粘滞会话和API版本化就出现了。