为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
时,它将如何处理这种情况那一刻?
答案 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版本控制得以解决。