PM2 是什么?一篇讲清 Node.js 进程管理器的文章

在 Node.js 应用部署到服务器之后,开发者很快会遇到几个现实问题:

  • 服务挂了怎么办?
  • 服务器重启后应用如何自动恢复?
  • 如何管理多个 Node.js 服务?
  • 如何查看日志、监控运行状态?

PM2(Process Manager 2) 正是为解决这些问题而诞生的。


一、PM2 是什么?

PM2 是一个用于 Node.js 应用的生产级进程管理器

简单说,它是一个 守护程序(daemon)+ 管理工具,负责:

  • 启动 Node.js 应用
  • 保证应用持续运行
  • 管理多个进程
  • 提供日志、监控、重启能力

虽然 PM2 主要用于 Node.js,但它本质上是通用进程管理器,也可以管理:

  • Python 程序
  • Shell 脚本
  • 任意可执行文件

二、为什么需要 PM2?

1. Node.js 原生启动方式的问题

传统启动方式:

bash 复制代码
node app.js

存在的问题:

  • 进程崩溃后不会自动重启
  • SSH 断开后进程可能退出
  • 服务器重启后需要手动再启动
  • 无法统一管理多个服务

这些在开发阶段问题不大,但在生产环境是不可接受的。


2. PM2 帮你解决了什么?

PM2 提供了:

  • 进程守护:程序崩溃自动重启
  • 后台运行:SSH 断开也不会退出
  • 开机自启:服务器重启后自动拉起服务
  • 日志管理:集中查看 stdout / stderr
  • 多进程管理:方便管理多个服务
  • 负载均衡(cluster 模式)

三、PM2 的核心功能

1. 启动和管理应用

bash 复制代码
pm2 start app.js
pm2 stop app
pm2 restart app
pm2 delete app

你可以像管理服务一样管理 Node.js 程序。


2. 进程守护与自动重启

当应用因为异常退出时,PM2 会自动将其拉起:

  • 内存溢出
  • 未捕获异常
  • 手动 kill
  • 程序崩溃

这对线上服务至关重要。


3. 日志管理

bash 复制代码
pm2 logs
pm2 logs app

PM2 会自动收集:

  • 标准输出(stdout)
  • 错误输出(stderr)

无需自己重定向日志文件。


4. 开机自启

bash 复制代码
pm2 startup
pm2 save

服务器重启后,PM2 会自动恢复所有已保存的进程。


5. Cluster 模式(多核利用)

Node.js 单进程只能使用一个 CPU 核心,PM2 可以:

bash 复制代码
pm2 start app.js -i max
  • 自动根据 CPU 核心数启动多个实例
  • 内置负载均衡
  • 对外表现为一个服务

这在高并发场景非常常见。


四、PM2 的典型使用场景

1. Node.js Web 服务

  • Express / Koa / NestJS
  • Next.js(standalone / custom server)

2. 后台任务 / 定时脚本

  • 消费队列
  • 定时任务
  • 长时间运行脚本

3. 多服务部署

  • API 服务
  • Web 前端服务
  • Worker 服务

全部交给 PM2 统一管理。


五、PM2 和 Docker 的关系

PM2 和 Docker 不是对立关系

  • 不使用 Docker:PM2 是最简单可靠的方案

  • 使用 Docker

    • 容器内通常只跑一个进程,PM2 可选
    • 但在某些场景(多 Node 实例、日志、重启)仍然有价值

是否在 Docker 中使用 PM2,取决于团队规范和复杂度。


六、PM2 的优缺点

优点

  • 使用简单,学习成本低
  • 功能完善,生产环境成熟
  • 社区活跃,文档齐全
  • 对 Node.js 生态支持非常好

缺点

  • 不适合超大规模集群调度(应使用 Kubernetes)
  • 对非 Node 项目只是"能用",不是最优
  • Cluster 模式下调试略复杂

七、总结

PM2 是 Node.js 应用部署中几乎绕不开的工具

如果你:

  • 在 Linux 服务器上跑 Node.js
  • 不想自己写守护脚本
  • 希望服务稳定、可管理、可恢复

那么 PM2 是一个成熟、可靠、低门槛的选择

它不是"高大上"的分布式调度系统,但在单机或中小规模部署中,非常实用、非常工程化

相关推荐
xywww1686 小时前
Node.js Claude API 实战接入:SDK 调用 Opus 5、环境变量配置与报错排查
node.js
weixin_431600447 小时前
NestJS 入门(7):生命周期钩子——构造函数和 `OnModuleInit` 差在哪?
前端·后端·学习·node.js·nest.js
深念Y7 小时前
基于 NapCat 与本地 RAG 的群聊 AI 机器人方案(ARM64 部署)
人工智能·ai·机器人·node.js·自动化·情感陪伴·bot
__zRainy__8 小时前
Node系列 · Node基础:Node.js 概述
后端·node.js
烂蜻蜓8 小时前
Node.js入门教程(二十四):常用工具(util 模块)
node.js
oushaojun29 小时前
使用docker安装node.js和deepseek harness
node.js·dsh
爱丶不疚9 小时前
搞不清 CommonJS 与 ESM,你是否也有这些疑问🤔
前端·node.js
cyadyx12 小时前
Vite 比 Webpack 构建效率更高
前端·webpack·node.js·vite
烂蜻蜓1 天前
Node.js入门教程(十一):异步编程
node.js
Sca_杰1 天前
微信客服API对接速通
javascript·node.js