PM2 可以且推荐用于生产环境,尤其适合管理 Node.js 应用。以下是详细分析及使用建议:
一、PM2 适用于生产环境的核心原因
进程守护与自动恢复
- 若进程崩溃或服务器重启,PM2 会自动重启应用,保障服务高可用。
- 示例:
pm2 start app.js --name "api"
后,即使应用抛出未捕获的异常,PM2 也会重新拉起进程。
集群模式(负载均衡)
- 支持多实例负载均衡,充分利用多核 CPU。
- 命令:
1
pm2 start app.js -i max --name "cluster-app" # 根据 CPU 核心数启动最大进程数
日志与监控
- 自动记录标准输出和错误日志,支持日志分割和归档。
- 实时监控资源占用:
1
2pm2 monit # 查看实时仪表盘
pm2 logs --lines 100 # 显示最近 100 行日志
零停机热重载
- 通过
reload
实现无缝更新,避免服务中断:1
pm2 reload app.js # 依次重启进程,保持至少一个实例在线
- 通过
生态系统集成
- 通过
ecosystem.config.js
文件集中管理配置,支持环境变量、部署脚本等:1
2
3
4
5
6
7
8
9
10
11
12module.exports = {
apps: [{
name: "prod-api",
script: "src/app.js",
instances: 4,
exec_mode: "cluster",
env: {
NODE_ENV: "production",
PORT: 3000
}
}]
};
- 通过
二、生产环境最佳实践
配置标准化
- 使用配置文件替代命令行参数,便于版本控制和团队协作。
- 启动命令:
1
pm2 start ecosystem.config.js --env production
安全加固
- 避免使用
sudo
运行 PM2,通过pm2 startup
生成系统服务(如 systemd):1
2pm2 startup systemd # 生成自启动脚本
systemctl enable pm2-你的用户名 # 启用服务
- 避免使用
资源限制与监控
- 设置内存上限防止内存泄漏:
1
pm2 start app.js --max-memory-restart 500M # 内存超500MB时重启
- 集成外部监控工具(如 Prometheus + Grafana)。
- 设置内存上限防止内存泄漏:
日志管理
- 使用
pm2-logrotate
模块避免日志占满磁盘:1
2pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 100M # 单个日志文件最大100MB
- 使用
与 Docker/Kubernetes 集成
- 在容器中作为主进程运行(PID 1),但需确保正确处理信号:
1
CMD ["pm2-runtime", "ecosystem.config.js"]
- 在容器中作为主进程运行(PID 1),但需确保正确处理信号:
三、PM2 的局限性及注意事项
资源占用
PM2 本身占用少量内存(约 50-100MB),需计入服务器资源规划。复杂场景的替代方案
- 超大规模微服务:考虑 Kubernetes 或专业 PaaS 平台(如 AWS ECS)。
- 需要精细调度策略时,可结合
nginx
或 HAProxy 做流量分发。
版本稳定性
- 生产环境应锁定 PM2 版本,避免自动升级引入意外问题:
1
npm install pm2@4.5.0 -g # 指定版本
- 生产环境应锁定 PM2 版本,避免自动升级引入意外问题:
四、与其他工具的对比
工具 | 生产适用性 | 关键功能 |
---|---|---|
PM2 | ✅ 推荐 | 集群、监控、日志、自动恢复 |
forever | ⚠️ 仅基础守护 | 进程守护(无集群/监控) |
nodemon | ❌ 仅开发环境 | 文件变更重启 |
五、总结
PM2 是 Node.js 应用在生产环境的理想选择,尤其适合中小型项目或容器化部署。合理配置后,可显著提升服务的可靠性和可维护性。对于大型分布式系统,建议结合 Kubernetes 等编排工具使用。