Back to Blog
2026-02-26ToolBox Team

PM2 完全指南 - Node.js 生产环境进程管理

📌 相关工具推荐 | Related Tool

⚙️tools.cronGenerator
nodejspm2devopsmonitoring

PM2 完全指南 - Node.js 生产环境进程管理

当 Node.js 应用从本地开发进入生产环境,光靠 npm start 远远不够。我们需要一个强大的进程管理工具,PM2 正是这样的利器。

为什么不能直接用 Node.js 运行?

在生产环境中,直接运行 node app.js 会面临多个问题:

  • 应用崩溃后无法自动恢复:一旦出错,整个服务离线
  • 无法充分利用多核 CPU:单进程只能用一个核心
  • 日志难以管理和追踪:标准输出日志容易丢失
  • 无法实时监控应用状态:无法及时发现问题
  • 更新代码需要手动重启:遗漏重启导致版本不一致

PM2 完美解决了这些问题。

PM2 安装与基础使用

安装

npm install -g pm2

启动应用

pm2 start app.js --name "my-app"

这条命令:

  • 以 PM2 托管方式启动 app.js
  • 给应用起名为 my-app
  • 自动保存进程信息到 PM2 数据库

查看运行状态

pm2 list

输出示例:

id │ name    │ namespace   │ version │ mode   │ pid    │ status
0  │ my-app  │ default     │ 1.0.0   │ fork   │ 12345  │ online

停止、重启、删除

pm2 stop my-app        # 停止应用
pm2 restart my-app     # 重启应用
pm2 delete my-app      # 删除应用

核心特性深度剖析

1. 集群模式 - 充分利用多核 CPU

单进程模式只能利用一个 CPU 核心,而集群模式可以启动多个进程分担负载。

pm2 start app.js --name "my-app" -i max

参数说明:

  • -i 参数指定进程数
  • max 表示根据 CPU 核心数自动启动相同数量的进程
  • 也可以手动指定:-i 4 启动 4 个进程

查看集群状态:

pm2 list

输出示例:

id │ name    │ mode       │ pid    │ status
0  │ my-app  │ cluster    │ 12345  │ online
1  │ my-app  │ cluster    │ 12346  │ online
2  │ my-app  │ cluster    │ 12347  │ online
3  │ my-app  │ cluster    │ 12348  │ online

Nginx 会自动轮询分配请求到这 4 个进程。

2. 自动重启机制

应用崩溃自动恢复

pm2 start app.js --max-memory-restart 500M

如果应用内存占用超过 500MB,PM2 会自动重启它。

文件监听与自动重载

开发阶段,代码修改后自动重启应用:

pm2 start app.js --watch

忽略某些目录:

pm2 start app.js --watch --ignore-watch="node_modules|logs"

3. 完整的配置文件

创建 ecosystem.config.js

module.exports = {
  apps: [
    {
      name: 'web-app',
      script: './app.js',
      instances: 'max',
      exec_mode: 'cluster',
      env: {
        NODE_ENV: 'production'
      },
      error_file: './logs/err.log',
      out_file: './logs/out.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
      merge_logs: true,
      max_memory_restart: '500M',
      watch: false,
      ignore_watch: ['node_modules', 'logs'],
      max_restarts: 10,
      min_uptime: '10s',
      autorestart: true,
      // 优雅关闭配置
      kill_timeout: 5000,
      listen_timeout: 3000,
    }
  ]
};

启动应用:

pm2 start ecosystem.config.js

4. 日志管理

查看实时日志:

pm2 logs my-app

查看历史日志:

pm2 logs my-app --lines 100

清空日志:

pm2 flush

重要提示:生产环境应该采用结构化日志(JSON 格式),便于分析和聚合。可以用 Winston 或 Pino 库增强日志功能。

5. 实时监控

启动监控仪表板:

pm2 monit

这会显示:

  • 实时 CPU 和内存使用率
  • 应用状态和重启次数
  • 运行时间

生产环境最佳实践

1. 优雅关闭 (Graceful Shutdown)

应用应该监听 SIGTERM 信号,完成现有请求后再退出:

process.on('SIGTERM', async () => {
  console.log('收到关闭信号,开始优雅关闭...');
  
  // 停止接收新请求
  server.close(() => {
    console.log('HTTP 服务器已关闭');
  });

  // 关闭数据库连接
  await db.close();
  
  // 清理资源
  process.exit(0);
});

配置文件中设置超时时间:

kill_timeout: 5000,  // 5秒超时后强制杀进程

2. 系统启动时自动启动 PM2

pm2 startup

这会生成一个 systemd 服务,系统重启后自动启动 PM2 应用。

3. 保存进程列表

pm2 save

记录当前运行的所有应用,系统重启后会自动恢复。

4. 依赖管理

如果应用依赖其他服务(如数据库),可以定义依赖关系:

{
  name: 'api',
  script: './api.js',
  depends_on: ['database']
}

5. 环境变量隔离

module.exports = {
  apps: [
    {
      name: 'api-dev',
      script: './app.js',
      env: { NODE_ENV: 'development' }
    },
    {
      name: 'api-prod',
      script: './app.js',
      env: { NODE_ENV: 'production' }
    }
  ]
};

常见问题解决

进程频繁重启

原因:应用启动失败或返回非零退出码
解决:检查日志找出错误,确保依赖服务已启动

pm2 logs my-app --err

内存持续增长

原因:内存泄漏
解决:使用内存分析工具定位泄漏,检查是否创建了未释放的对象

pm2 start app.js --max-memory-restart 1G

无法重启应用

原因:端口被占用或权限不足
解决:查看进程占用的端口

pm2 describe my-app  # 查看进程信息
netstat -tulpn | grep 3000  # 查看端口占用

与 Docker + Nginx 集成

PM2 常与 Docker 和 Nginx 配合使用,构建完整的生产环境:

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install -g pm2 && npm install

COPY . .

EXPOSE 3000

# 启动 PM2
CMD ["pm2-runtime", "start", "ecosystem.config.js"]

使用 pm2-runtime 确保 PM2 前台运行,Docker 能正确跟踪进程。


相关工具推荐