如何在Node.js中实现零停机重新部署
什么是最简单的方法来实现我的Node.js应用程序的零宕机?
我有一个应用程序,需要以下步骤重新部署:
npm install
-
node_modules/.bin/bower install
-
node_modules/.bin/gulp
这些操作的结果是由名为build
的gulpfile.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版本化就出现了。