运行中的NestJS应用构建是否安全?如何实现无停机更新?
NestJS生产环境无停机更新方案及运行时Build的安全性分析
运行时执行npm run build是否安全?
直接在应用运行时执行npm run build不会直接导致运行中应用崩溃,但存在潜在风险:
- NestJS默认的
build命令会将TS代码编译到dist目录,编译过程中会覆盖旧的dist文件。如果运行中的应用刚好在读取某个被覆盖的动态加载模块,可能触发不可预测的错误,但常规场景下Node.js会缓存已加载的模块,因此影响概率较低。 - 但这个操作解决不了停机问题——你后续重启应用的瞬间,服务还是会中断。
真正实现无停机更新的方案
1. PM2集群模式+重载功能
PM2原生支持零停机重启,步骤如下:
- 用集群模式启动应用(根据CPU核心数自动分配进程数):
pm2 start npm --name "nest-prod" -i max -- run start:prod - 代码变更后,建议在本地完成
npm run build,再将dist目录、package.json等必要文件上传到服务器(减少服务器编译耗时和风险) - 执行PM2重载命令:
PM2会逐个重启集群内的进程,始终保留可用进程处理请求,完全避免停机。pm2 reload nest-prod
2. 蓝绿部署(适用于需灰度验证的场景)
- 维护两套完全一致的运行环境:蓝环境为当前在线版本,绿环境部署新版本
- 先在绿环境完成新版本的部署与验证
- 切换负载均衡器的流量指向绿环境
- 确认服务稳定后,再停止蓝环境的应用
不推荐的操作
- 不要在build后直接执行
pm2 restart,该命令会一次性杀死所有进程再重启,必然导致服务中断,和你之前的操作本质无区别。 - 尽量避免在生产服务器上执行
npm install,优先在本地安装依赖并打包后上传,降低服务器操作风险与耗时。
内容的提问来源于stack exchange,提问作者Eugene Beliaev
相关产品推荐
相关产品推荐

