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 仅限开发。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台