PM2 完全指南:Node.js 生产进程管理
PM2 是 Node.js 生产的标准进程管理器:进程守护、零停机重载、日志管理、集群模式与开机自启。本文按生产路径逐一实战。
PM2 核心命令五条:pm2 start app.js -i max 集群模式启动、pm2 reload 零停机重载、pm2 logs 看日志、pm2 monit 监控资源、pm2 save && pm2 startup 开机自启。它把 Node 应用从"裸进程"变成"可运维服务"。
安装与启动
npm install -g pm2
# 开发模式:文件变更自动重启
pm2 start app.js --watch
# 生产模式:命名 + 集群
pm2 start app.js --name my-api -i max
进程守护与自愈
PM2 守护应用:崩溃自动重启、退出码异常告警。pm2 list 查看状态——restart 计数是应用健康的第一信号:频繁重启说明有未捕获异常在反复杀死进程。
自动重启策略调优
# 内存超阈值重启(防泄漏拖垮)
pm2 start app.js --max-memory-restart 500M
# 崩溃后延迟重启,快速失败保护(15 秒内重启超 10 次则停止)
pm2 start app.js --exp-backoff-restart-delay=100
--exp-backoff-restart-delay 是生产必备——崩溃循环时不至于把 CPU 打满。
零停机重载与开机自启
pm2 reload my-api # 逐个替换实例,服务不中断(cluster 模式)
pm2 save # 保存当前进程列表
pm2 startup # 生成系统启动脚本(systemd)
reload vs restart:reload 零停机(逐个替换),restart 直接全杀——生产永远用 reload。
日志管理
pm2 logs my-api # 实时跟踪
pm2 logs --lines 200 # 最近 200 行
pm2 flush # 清空日志
日志默认在 ~/.pm2/logs/。磁盘管理装 pm2-logrotate 模块(按大小轮转、保留天数)——生产必装,否则日志吃满磁盘。
集群模式
-i max 按 CPU 核数起实例,PM2 内置负载均衡。细节见本系列《Node.js 集群扩容实战》。
部署工作流(pm2 deploy)
ecosystem.config.js 声明部署目标后,pm2 deploy production 完成:拉代码 → 装依赖 → 构建 → reload——中小项目的轻量 CI/CD。
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-api',
script: 'dist/index.js',
instances: 'max',
exec_mode: 'cluster',
max_memory_restart: '500M',
env_production: { NODE_ENV: 'production' },
}],
};
从进程存活继续检查服务健康
PM2 自动重启后,服务表面上恢复了,但崩溃原因可能仍在。配置 DataKit 采集进程指标和应用日志,在观测云中对照内存趋势、退出日志与部署时间。重启次数需要从 PM2 日志或额外指标中取得,不能假设普通进程采集器自带该计数;告警也应区分计划发布与异常退出。
常见问题(FAQ)
Q:PM2 和 Docker/K8s 冲突吗?
思路不同:PM2 管单机进程,K8s 管容器编排。容器内通常单进程(不需要 PM2 守护,K8s 负责重启);但容器内用 PM2 集群模式吃满多核仍有价值。
Q:PM2 和企业版 PM2 Plus 的关系?
开源版功能对绝大多数场景足够;Plus 提供托管监控面板。自建观测方案(观测云等)可替代 Plus 的监控价值。
Q:--watch 能用于生产吗?
不能——watch 模式文件变更即重启,生产环境的意外文件变更(日志写入目录被监听等)会造成意外重启。watch 仅限开发。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。