PM2无缝部署新版本:避免服务中断及构建状态配置问询
解决PM2零停机重启与构建阶段状态显示问题
一、实现零停机重启(旧进程持续至新进程就绪)
PM2默认的restart命令会先终止旧进程再启动新进程,导致服务中断。要实现零停机,需通过生态系统配置文件配合reload命令实现:
- 创建/修改
ecosystem.config.js,添加关键配置:
module.exports = { apps: [ { name: 'your-app', script: './server.js', // 你的应用启动脚本路径 wait_ready: true, // 等待进程发送ready信号 listen_timeout: 30000, // 等待ready信号的超时时间(单位:毫秒,按需调整) kill_timeout: 5000, // 旧进程收到终止信号后的等待时间,确保新进程就绪再退出 env: { NODE_ENV: 'production' } } ] };
- 在应用代码中,必须在构建完成且服务监听端口后,向PM2发送
ready信号:
以Node.js/Express应用为例:
const express = require('express'); const app = express(); // 替换为实际的构建/初始化逻辑(如编译资源、加载配置等) async function initApp() { await new Promise(resolve => setTimeout(resolve, 15000)); app.listen(3000, () => { console.log('服务已在3000端口监听'); // 向PM2发送就绪信号 if (process.send) { process.send('ready'); } }); } initApp();
- 使用
pm2 reload命令执行零停机重启:
pm2 reload ecosystem.config.js
该命令会先启动新进程,等待其发送ready信号后再终止旧进程,全程无服务中断。
二、修正构建阶段的状态显示
默认情况下,PM2启动进程后会立即标记为running,但此时应用可能仍在构建中。通过上述wait_ready: true配置,PM2会在收到ready信号前将进程状态显示为launching,直到服务就绪后才切换为online,pm2 status即可准确反映应用所处阶段。
如果构建步骤独立于启动脚本(如单独的npm run build),可通过PM2的pre_start钩子在启动进程前执行构建:
module.exports = { apps: [ { // ...其他配置 pre_start: 'npm run build', // 启动进程前先执行构建命令 } ] };
此时PM2会先完成构建,再启动应用进程,全程状态保持launching直到收到ready信号。
内容的提问来源于stack exchange,提问作者Sherif eldeeb
相关产品推荐
相关产品推荐

