PM2 是一个生产级的 Node.js 应用进程管理器,拥有超过 100 万次 NPM 下载量,是全球最流行的 Node.js 部署工具之一。它提供了内置负载均衡器、零停机重载、开机自启动、监控和微服务管理等强大功能,让 Node.js 应用的生产环境部署变得简单而可靠。
PM2 的核心价值
Node.js 单线程的特性使其在高并发场景下面临挑战,同时应用崩溃后的自动恢复、日志管理、监控等运维问题也需要专业的解决方案。PM2 应运而生,作为一个守护进程管理器,它不仅能让应用永远在线,还提供了生产环境所需的一切工具链。
PM2 的核心定位是:让 Node.js 应用的生产环境部署变得简单、可靠、高效。它支持 Linux、macOS 和 Windows,兼容 Node.js 12.X+ 版本和 Bun v1+,无论是传统的 Node.js 应用还是新兴的 Bun 应用,PM2 都能完美支持。
核心特性
1. 进程管理
PM2 的进程管理功能是其基础,也是最实用的特性:
- 自动守护进程:应用以守护进程方式运行,不会随终端关闭而停止
- 进程保活:应用崩溃后自动重启,确保服务可用性
- 内存限制重启:当应用内存超过阈值时自动重启,防止内存泄漏
- 自动重启策略:配置重启延迟、最大重启次数等策略,避免重启风暴
这些功能让 Node.js 应用在生产环境中稳定运行,无需担心应用意外退出或内存泄漏导致的服务中断。
2. Cluster 模式(负载均衡)
Cluster 模式是 PM2 最强大的特性之一,它利用 Node.js 的 cluster 模块,将单个 Node.js 应用扩展为多个进程,自动实现负载均衡:
- 内置负载均衡器:自动分配 HTTP/WebSocket/TCP/UDP 连接到各个进程
- 多进程扩展:无需修改应用代码,即可利用所有 CPU 核心
- 零停机重载:更新代码时无需停止服务,实现平滑升级
- 性能提升:在 16 核机器上,性能提升可达 10 倍
这种模式特别适合高并发的 API 服务和 Web 应用,极大提升了应用的吞吐量和可靠性。
3. 日志管理
完善的日志管理是生产环境运维的关键:
- 实时日志查看:
pm2 logs命令实时输出所有应用的日志 - 多种日志格式:支持标准、Raw、JSON、格式化等输出方式
- 日志轮转:通过
pm2-logrotate模块实现自动日志轮转 - 日志清理:
pm2 flush命令快速清空日志
这些功能让日志管理变得简单,避免了日志文件无限增长导致磁盘空间不足的问题。
4. 监控与诊断
PM2 提供了多层监控能力:
- 终端监控:
pm2 monit命令提供终端内的实时监控界面 - 主机监控:监控 CPU、内存、磁盘等主机指标
- PM2+ 在线监控:跨服务器的 Web 监控仪表板
- 自定义指标:支持应用自定义指标监控
这些监控功能让开发者实时了解应用运行状态,快速定位和解决问题。
5. 开机自启动
服务器重启后自动恢复服务是生产环境的基本要求:
- 多 init 系统支持:支持 systemd、upstart、launchd、rc.d 等主流 init 系统
- 进程列表持久化:
pm2 save命令保存当前进程列表 - 自动恢复服务:服务器重启后自动恢复所有 PM2 管理的服务
只需简单配置 pm2 startup 和 pm2 save,就能实现服务的自动恢复,无需手动干预。
6. 配置管理
对于复杂的多应用部署,PM2 提供了 Ecosystem 配置文件:
- 配置文件管理:支持 JavaScript、YAML、JSON 格式的配置文件
- 多应用管理:一个配置文件管理多个应用
- 环境变量配置:支持不同环境的配置(development、production)
- 配置生成:
pm2 ecosystem命令快速生成配置文件模板
这使得大规模的微服务部署变得简单,所有配置集中管理,易于维护。
快速入门
安装 PM2
PM2 可以通过 NPM 或 Bun 安装:
1 | # 使用 NPM 安装 |
基本使用
启动一个 Node.js 应用:
1 | # 启动应用 |
管理应用进程:
1 | # 列出所有进程 |
查看日志:
1 | # 查看实时日志 |
Ecosystem 配置文件
对于复杂的应用,使用配置文件更方便:
1 | module.exports = { |
启动配置文件:
1 | # 生成配置文件 |
进阶功能
Cluster 模式详解
Cluster 模式是 PM2 的核心优势,它利用多核 CPU 提升应用性能:
1 | # Cluster 模式启动(使用所有 CPU) |
配置文件中的 Cluster 模式:
1 | module.exports = { |
重要提示:Cluster 模式要求应用是无状态的,因为请求会被分配到不同的进程。使用 Redis、MongoDB 等外部存储来共享状态,遵循 Twelve Factor App 原则。
零停机重载
零停机重载(Zero Downtime Reload)是 PM2 的重要特性:
1 | # 零停机重载(网络应用) |
reload vs restart:
restart:杀死进程并重启,会有短暂停机reload:逐个重启进程,保持服务可用
如果 reload 失败(如应用不优雅退出),PM2 会自动回退到 restart。
Graceful Shutdown
在生产环境中,优雅关闭应用非常重要:
1 | process.on('SIGINT', function() { |
优雅关闭确保:
- 等待当前请求处理完成
- 关闭数据库连接
- 清理缓存和队列
- 保存必要的状态
监控
终端监控:
1 | # 启动终端监控 |
PM2 提供的监控指标:
- CPU 使用率
- 内存使用量
- 重启次数
- 运行时间
- 自定义指标
开机自启动
配置开机自启动:
1 | # 生成启动脚本(自动检测 init 系统) |
不同的 init 系统:
- systemd:现代 Linux 发行版
- upstart:旧版 Ubuntu
- launchd:macOS
- rc.d:传统 Unix 系统
移除启动脚本:
1 | pm2 unstartup |
Docker 集成
在 Docker 中使用 PM2:
1 | FROM node:18-alpine |
pm2-runtime 是专门为容器设计的运行时,提供了更健壮的生产环境支持。
与其他工具对比
| 特性 | PM2 | forever | nodemon |
|---|---|---|---|
| 负载均衡 | 支持 | 不支持 | 不支持 |
| Cluster 模式 | 支持 | 不支持 | 不支持 |
| 零停机重载 | 支持 | 不支持 | 不支持 |
| 日志管理 | 完善 | 基础 | 基础 |
| 监控 | 完善(终端+Web) | 基础 | 不支持 |
| 开机自启动 | 支持 | 不支持 | 不支持 |
| 配置文件 | 支持 | 不支持 | 支持 |
| 适用场景 | 生产环境 | 简单守护 | 开发环境 |
总结:
- PM2:生产环境首选,功能最全面
- forever:简单的进程守护,适合小型应用
- nodemon:开发工具,用于自动重启,不适合生产环境
实战场景
场景 1:生产环境部署
1 | # 1. 启动应用(Cluster 模式) |
场景 2:微服务管理
1 | module.exports = { |
1 | # 启动所有服务 |
场景 3:高可用架构
结合 PM2 和负载均衡器:
1 | Nginx / HAProxy |
这种架构实现了:
- 应用层面的负载均衡(PM2 Cluster)
- 服务层面的负载均衡(Nginx/HAProxy)
- 状态共享(Redis/MongoDB)
- 高可用性
总结
PM2 是 Node.js 生产环境部署的终极武器,它不仅是一个进程管理器,更是一个完整的生产环境解决方案。核心优势包括:
- 简单易用:一行命令启动应用,配置简单直观
- 功能全面:进程管理、负载均衡、日志、监控、开机自启一应俱全
- 性能优秀:Cluster 模式显著提升应用性能
- 可靠性高:自动重启、零停机重载确保服务可用性
- 生态成熟:100M+ 下载量,社区活跃,文档完善
适用场景:
- 生产环境的 Node.js 应用部署
- 高并发的 API 服务
- 微服务架构
- 需要高可用性的应用
注意事项:
- Cluster 模式要求应用无状态
- 使用外部存储(Redis、MongoDB)共享状态
- 配置优雅关闭确保数据安全
- 合理配置内存限制防止内存泄漏
学习资源
- 官方文档:https://pm2.keymetrics.io/docs/
- GitHub 仓库:https://github.com/Unitech/pm2
- PM2+ 监控:https://app.pm2.io/
- NPM 包:https://www.npmjs.com/package/pm2
无论你是个人开发者还是团队运维,PM2 都是 Node.js 生产环境部署的不二之选。让 PM2 成为你的生产环境武器,专注于业务逻辑而非运维细节。