一、PM2 简介与核心概念

PM2(Process Manager 2)是 Node.js 生态中最流行的生产级进程管理器,由 Keymetrics 团队维护。它在 GitHub 上拥有超过 40,000 颗 Star,被全球数十万开发者用于生产环境。

核心能力:

  • 进程守护:应用崩溃后自动重启,保证服务高可用
  • 负载均衡:Cluster 模式利用多核 CPU,零配置实现水平扩展
  • 日志管理:统一的日志收集、轮转和持久化
  • 零停机重载pm2 reload 在更新代码时不中断服务
  • 监控面板:终端内实时查看 CPU、内存、请求速率
PM2 Daemon 进程守护进程 God Daemon (god) App Instance 1 Cluster Worker App Instance 2 Cluster Worker App Instance 3 Cluster Worker App Instance N Cluster Worker 日志管理 健康检查 CPU 监控 内存监控 PM2 进程管理架构 — Daemon 守护 → God Daemon 调度 → Worker 实例集群

二、安装与快速上手

# 全局安装 PM2
npm install -g pm2

# 验证安装
pm2 --version
# 输出: 5.3.0

# 启动一个 Node.js 应用
pm2 start app.js --name "my-api"

# 查看运行中的应用
pm2 list
# ┌─────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┐
# │ id  │ name     │ namespace   │ version │ mode    │ pid      │ uptime │
# ├─────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┤
# │ 0   │ my-api   │ default     │ 1.0.0   │ fork    │ 12345    │ 2h     │
# └─────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┘

三、Ecosystem 配置文件——生产环境标准

对于生产环境,推荐使用 ecosystem.config.js 替代命令行参数:

// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'finboost-api',
    script: './server.js',
    
    // Cluster 模式配置
    instances: 'max',        // 自动匹配 CPU 核心数
    exec_mode: 'cluster',    // 集群模式
    
    // 环境变量
    env: {
      NODE_ENV: 'production',
      PORT: 3004,
    },
    env_development: {
      NODE_ENV: 'development',
      PORT: 3004,
    },
    
    // 自动重启配置
    max_memory_restart: '1G',
    max_restarts: 10,
    min_uptime: '10s',
    restart_delay: 4000,
    
    // 日志配置
    error_file: './logs/err.log',
    out_file: './logs/out.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
    merge_logs: true,
    
    // 优雅关闭
    kill_timeout: 5000,
    listen_timeout: 3000,
    shutdown_with_message: true,
    
    // 部署配置
    watch: false,           // 生产环境建议关闭
    ignore_watch: ['node_modules', 'logs'],
  }]
};

启动命令:

# 使用 ecosystem 配置启动
pm2 start ecosystem.config.js

# 启动并指定环境
pm2 start ecosystem.config.js --env production

# 零停机重载(生产环境更新代码后)
pm2 reload ecosystem.config.js

# 重启所有应用
pm2 restart all

四、Cluster 模式详解

Cluster 模式是 PM2 的核心竞争力之一。它利用 Node.js 内置的 cluster 模块,自动 fork 多个子进程来充分利用多核 CPU:

# 启动 Cluster 模式(自动检测 CPU 核心数)
pm2 start app.js -i max

# 指定实例数量
pm2 start app.js -i 4

# 查看 CPU 使用情况
pm2 monit

Cluster 模式 vs Fork 模式对比:

特性 Fork 模式 Cluster 模式
多核利用✅ 自动
负载均衡需外部方案✅ 内置 Round-Robin
Session 共享单进程⚠️ 需要 Redis
零停机重载短暂中断✅ 逐个 Worker 替换
内存占用N × 单个进程

五、日志管理与轮转

# 查看实时日志
pm2 logs

# 查看特定应用日志
pm2 logs my-api

# 查看最近 200 行
pm2 logs --lines 200

# 安装日志轮转模块
pm2 install pm2-logrotate

# 配置日志轮转
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30          # 保留 30 个文件
pm2 set pm2-logrotate:compress true      # 压缩旧日志
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'  # 每天轮转

六、监控面板与性能分析

# 终端监控面板(实时 CPU / 内存 / 请求速率)
pm2 monit

# JSON 格式状态输出
pm2 status

# 详细信息(包括环境变量、重启次数、运行时间)
pm2 show my-api

# Web 仪表盘(需要 PM2 Plus 账户)
pm2 web
# 打开 http://localhost:9615

七、开机自启配置

# 生成启动脚本
pm2 startup

# 输出示例:
# [PM2] To setup the Startup Script, copy/paste the following command:
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u deploy --hp /home/deploy

# 执行上面输出的命令(根据你的环境调整)
sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u root --hp /root

# 保存当前进程列表,确保重启后恢复
pm2 save

# 验证自启状态
systemctl status pm2-root

八、常用命令速查表

命令 说明
pm2 start app.js启动应用
pm2 stop app停止应用
pm2 restart app重启应用
pm2 reload app零停机重载(推荐)
pm2 delete app删除应用
pm2 list查看进程列表
pm2 logs查看实时日志
pm2 flush清空日志
pm2 save保存进程列表
pm2 resurrect恢复已保存的进程列表
💡 生产环境最佳实践

始终使用 ecosystem.config.js 管理配置,将其纳入版本控制。通过 pm2 reload 而非 pm2 restart 进行零停机更新。务必配置日志轮转避免磁盘写满。对于 Session 共享问题,使用 Redis 或数据库存储 Session 数据。