跳转到内容

pm2 - 开源琅嬛阁

Unitech/pm2

Node.js Production Process Manager with a built-in Load Balancer.

1
1.1k
43,223
2.7k
github.com · Unitech/pm2

项目介绍

PM2(Process Manager 2)是面向 Node.js 与 Bun 应用的生产级进程管理器,自 2013 年起广泛用于线上部署。它把应用以守护进程方式常驻运行,崩溃后自动拉起,并提供集群模式在多核机器上负载均衡 HTTP/TCP/UDP 流量。配合 pm2 reload 可实现零停机热更新,同时覆盖日志聚合、开机自启脚本生成、Docker pm2-runtime 集成等常见运维任务,支持 Linux、macOS 与 Windows。

核心特性

  • 一键守护启动pm2 start app.js 将应用后台化,持续监控并在异常退出时自动重启
  • 集群与负载均衡pm2 start api.js -i max 按 CPU 核数启动多实例,显著提升多核吞吐与容错能力
  • 零停机热重载pm2 reload all 滚动更新进程,避免发布时中断在线请求
  • 日志与监控pm2 logspm2 monit 集中查看输出;可安装 pm2-logrotate 做日志轮转
  • 开机自启pm2 startup + pm2 save 生成 systemd、launchd 等 init 脚本,重启后自动恢复进程列表
  • 容器友好pm2-runtime 作为 node 的 drop-in 替代,适合 Docker 镜像中以前台方式运行 Node 应用

对用户价值

手写 nohup node app.js & 难以应对崩溃重启、滚动发布与多实例调度;裸跑 node cluster 又缺少统一的管理界面与日志入口。PM2 把「启动—监控—重启—扩缩—发布」收敛到一套 CLI,让个人 VPS 与小团队也能获得接近 PaaS 的进程治理能力,而无需立刻引入 Kubernetes。对已有 Node 后端,迁移成本通常很低:多数场景只需把启动命令换成 pm2 start,再按需配置 ecosystem 文件与开机脚本。

与替代方案

  • 相比 nodemon,PM2 面向生产守护与集群调度,nodemon 侧重开发时文件变更自动重启,二者常搭配使用(开发用 nodemon,上线用 PM2)。
  • 相比 forever,PM2 功能面更完整(集群模式、零停机 reload、监控面板、startup 脚本、Docker runtime),社区体量与文档也更成熟;forever 更轻量,适合只需简单 keep-alive 的场景。
  • 相比 systemd 直接管理 node 单元,PM2 提供应用级进程列表、日志与热重载抽象,单机多 Node 服务时运维心智负担更低;若团队已全面容器化并由 K8s 编排,PM2 的价值主要在 VM/裸机或简单 Docker 部署层。
  • 相比 Docker + K8s,PM2 适合单台或少量服务器的 Node 守护,无需编排集群即可落地;K8s 适合多服务、弹性伸缩与复杂发布流水线,但学习与运维成本更高。
  • 边界说明:PM2 主要解决进程级治理,不替代反向代理(Nginx)、服务发现或配置中心;许可证为 AGPL-3.0,若需闭源商用分发或 SaaS 嵌入,应评估合规或联系官方获取其他许可。

适应人群

  • 在 VPS、裸机或简单 Docker 环境部署 Node.js/Bun 后端,需要崩溃自愈与日志集中查看的全栈工程师。
  • 希望用集群模式吃满多核 CPU、并以零停机方式发布 API 服务的后端与 DevOps 工程师。
  • 维护多台 Linux/macOS 服务器、需要统一 pm2 list 管理进程并配置开机自启的中小团队运维。

如何使用

前置条件

  • 操作系统:Linux、macOS 或 Windows。
  • 运行时:Node.js 18+,或 Bun 1+(仅 Bun 时需将 node 指向 Bun 的兼容运行时,详见官方 README)。
  • 包管理:npm 或 bun 可用于全局安装 PM2 CLI。

安装方式

通过 npm(推荐):

Terminal window
npm install pm2 -g

通过 Bun:

Terminal window
bun install pm2 -g

仅安装 Bun、无 Node.js 时,需让 PM2 的 shebang 能解析到 Bun:

Terminal window
sudo ln -s $(which bun) /usr/local/bin/node

升级 PM2:

Terminal window
npm install pm2@latest -g
pm2 update

首次运行

Terminal window
# 守护启动应用
pm2 start app.js
# 查看进程列表
pm2 list
# 集群模式(按 CPU 核数)
pm2 start api.js -i max
# 保存当前进程列表(配合开机自启)
pm2 save

生成开机自启脚本(按提示执行输出的 sudo 命令):

Terminal window
pm2 startup
pm2 save

Docker 中以前台方式运行(示例):

RUN npm install pm2 -g
CMD [ "pm2-runtime", "npm", "--", "start" ]

验证是否成功

Terminal window
pm2 --version # 应输出版本号
pm2 list # 应显示 online 状态的应用
pm2 describe app # 查看单应用详情(将 app 换为实际名称或 id)
pm2 logs # 应能看到应用标准输出/错误日志

确认 pm2 startup 后重启机器,pm2 list 中进程应自动恢复为 online。

常见坑 / 注意事项

  • AGPL-3.0 许可:修改 PM2 并以网络服务形式提供时可能触发 AGPL 义务;商业闭源场景请先阅读 README License 段或联系 Keymetrics。
  • 集群模式仅限 Node 集群场景-i 多实例主要面向 Node.js HTTP 等可集群化的应用;非 Node 二进制或脚本需单独评估是否适合 cluster。
  • 仅 Bun 环境:除 symlink node 外,部分生态工具仍假设真实 Node.js,混用前应实测目标依赖。
  • 日志磁盘占满:生产环境建议 pm2 install pm2-logrotate 并配置轮转策略,避免长期 pm2 logs 不写回导致磁盘爆满。
  • pm2 update 与进程列表:升级 PM2 后执行 pm2 update 以平滑迁移守护进程;重大版本升级前阅读 CHANGELOG
  • PM2+ 云服务:官方提供 PM2+ 监控面板(可选),开源 CLI 本身可离线使用,无需绑定 SaaS。