一、PM2 简介与核心概念
PM2(Process Manager 2)是 Node.js 生态中最流行的生产级进程管理器,由 Keymetrics 团队维护。它在 GitHub 上拥有超过 40,000 颗 Star,被全球数十万开发者用于生产环境。
核心能力:
- 进程守护:应用崩溃后自动重启,保证服务高可用
- 负载均衡:Cluster 模式利用多核 CPU,零配置实现水平扩展
- 日志管理:统一的日志收集、轮转和持久化
- 零停机重载:
pm2 reload在更新代码时不中断服务 - 监控面板:终端内实时查看 CPU、内存、请求速率
二、安装与快速上手
# 全局安装 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 数据。