You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PM2无缝部署新版本:避免服务中断及构建状态配置问询

解决PM2零停机重启与构建阶段状态显示问题

一、实现零停机重启(旧进程持续至新进程就绪)

PM2默认的restart命令会先终止旧进程再启动新进程,导致服务中断。要实现零停机,需通过生态系统配置文件配合reload命令实现:

  1. 创建/修改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'
      }
    }
  ]
};
  1. 在应用代码中,必须在构建完成且服务监听端口后,向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();
  1. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:42:53