PM2:Node.js 生产环境部署的终极武器

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 startuppm2 save,就能实现服务的自动恢复,无需手动干预。

6. 配置管理

对于复杂的多应用部署,PM2 提供了 Ecosystem 配置文件:

  • 配置文件管理:支持 JavaScript、YAML、JSON 格式的配置文件
  • 多应用管理:一个配置文件管理多个应用
  • 环境变量配置:支持不同环境的配置(development、production)
  • 配置生成pm2 ecosystem 命令快速生成配置文件模板

这使得大规模的微服务部署变得简单,所有配置集中管理,易于维护。

快速入门

安装 PM2

PM2 可以通过 NPM 或 Bun 安装:

1
2
3
4
5
6
7
8
9
# 使用 NPM 安装
npm install pm2 -g

# 使用 Bun 安装
bun install pm2 -g

# 更新到最新版本
npm install pm2@latest -g
pm2 update

基本使用

启动一个 Node.js 应用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动应用
pm2 start app.js

# 启动应用并命名
pm2 start app.js --name my-api

# 监视文件变化(开发模式)
pm2 start app.js --watch --ignore-watch="node_modules"

# 设置内存限制
pm2 start app.js --max-memory-restart 200M

# 传递参数
pm2 start app.js -- --port 3000

管理应用进程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 列出所有进程
pm2 list

# 重启应用
pm2 restart my-api

# 停止应用
pm2 stop my-api

# 删除应用
pm2 delete my-api

# 操作所有应用
pm2 restart all
pm2 stop all
pm2 delete all

查看日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看实时日志
pm2 logs

# 查看特定应用日志
pm2 logs my-api

# 查看历史日志
pm2 logs --lines 200

# JSON 格式输出
pm2 logs --json

# 格式化输出
pm2 logs --format

# 清空日志
pm2 flush

Ecosystem 配置文件

对于复杂的应用,使用配置文件更方便:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module.exports = {
apps: [{
name: "api",
script: "./api.js",
instances: "max",
exec_mode: "cluster",
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
PORT: 3000
}
}, {
name: "worker",
script: "./worker.js",
instances: 2,
exec_mode: "fork"
}]
};

启动配置文件:

1
2
3
4
5
6
7
8
# 生成配置文件
pm2 ecosystem

# 启动配置文件
pm2 start ecosystem.config.js

# 使用特定环境启动
pm2 start ecosystem.config.js --env production

进阶功能

Cluster 模式详解

Cluster 模式是 PM2 的核心优势,它利用多核 CPU 提升应用性能:

1
2
3
4
5
6
7
8
9
10
11
12
# Cluster 模式启动(使用所有 CPU)
pm2 start app.js -i max

# 启动指定数量实例
pm2 start app.js -i 4

# 使用所有 CPU 减 1
pm2 start app.js -i -1

# 扩展应用实例
pm2 scale my-api +3
pm2 scale my-api 2

配置文件中的 Cluster 模式:

1
2
3
4
5
6
7
8
module.exports = {
apps: [{
name: "api",
script: "./api.js",
instances: "max",
exec_mode: "cluster", // 必须设置为 cluster
}]
};

重要提示:Cluster 模式要求应用是无状态的,因为请求会被分配到不同的进程。使用 Redis、MongoDB 等外部存储来共享状态,遵循 Twelve Factor App 原则。

零停机重载

零停机重载(Zero Downtime Reload)是 PM2 的重要特性:

1
2
3
4
5
6
7
8
# 零停机重载(网络应用)
pm2 reload all

# 重载特定应用
pm2 reload my-api

# 重载配置文件中的应用
pm2 reload ecosystem.config.js --only api

reload vs restart

  • restart:杀死进程并重启,会有短暂停机
  • reload:逐个重启进程,保持服务可用

如果 reload 失败(如应用不优雅退出),PM2 会自动回退到 restart。

Graceful Shutdown

在生产环境中,优雅关闭应用非常重要:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
process.on('SIGINT', function() {
// 关闭数据库连接
db.stop(function(err) {
// 清理资源
process.exit(err ? 1 : 0);
});
});

// 或者使用 async/await
process.on('SIGINT', async () => {
try {
await db.close();
await cache.flush();
process.exit(0);
} catch (err) {
console.error(err);
process.exit(1);
}
});

优雅关闭确保:

  • 等待当前请求处理完成
  • 关闭数据库连接
  • 清理缓存和队列
  • 保存必要的状态

监控

终端监控:

1
2
3
4
5
6
# 启动终端监控
pm2 monit

# 启用主机监控
pm2 set pm2:sysmonit true
pm2 update

PM2 提供的监控指标:

  • CPU 使用率
  • 内存使用量
  • 重启次数
  • 运行时间
  • 自定义指标

开机自启动

配置开机自启动:

1
2
3
4
5
6
7
8
# 生成启动脚本(自动检测 init 系统)
pm2 startup

# 保存当前进程列表
pm2 save

# 验证启动脚本
pm2 resurrect

不同的 init 系统:

  • systemd:现代 Linux 发行版
  • upstart:旧版 Ubuntu
  • launchd:macOS
  • rc.d:传统 Unix 系统

移除启动脚本:

1
pm2 unstartup

Docker 集成

在 Docker 中使用 PM2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

# 全局安装 PM2
RUN npm install pm2 -g

# 使用 pm2-runtime
CMD ["pm2-runtime", "npm", "--", "start"]

pm2-runtime 是专门为容器设计的运行时,提供了更健壮的生产环境支持。

与其他工具对比

特性 PM2 forever nodemon
负载均衡 支持 不支持 不支持
Cluster 模式 支持 不支持 不支持
零停机重载 支持 不支持 不支持
日志管理 完善 基础 基础
监控 完善(终端+Web) 基础 不支持
开机自启动 支持 不支持 不支持
配置文件 支持 不支持 支持
适用场景 生产环境 简单守护 开发环境

总结

  • PM2:生产环境首选,功能最全面
  • forever:简单的进程守护,适合小型应用
  • nodemon:开发工具,用于自动重启,不适合生产环境

实战场景

场景 1:生产环境部署

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 启动应用(Cluster 模式)
pm2 start ecosystem.config.js --env production

# 2. 配置开机自启动
pm2 startup
pm2 save

# 3. 配置日志轮转
pm2 install pm2-logrotate

# 4. 启用监控
pm2 monit

场景 2:微服务管理

1
2
3
4
5
6
7
8
module.exports = {
apps: [
{ name: "api", script: "./services/api.js", instances: 4, exec_mode: "cluster" },
{ name: "auth", script: "./services/auth.js", instances: 2, exec_mode: "cluster" },
{ name: "worker", script: "./services/worker.js", instances: 1 },
{ name: "scheduler", script: "./services/scheduler.js", cron: "0 * * * *" }
]
};
1
2
3
4
5
6
7
8
# 启动所有服务
pm2 start ecosystem.config.js

# 重启特定服务
pm2 restart api

# 查看特定服务日志
pm2 logs api

场景 3:高可用架构

结合 PM2 和负载均衡器:

1
2
3
4
5
6
7
8
9
10
              Nginx / HAProxy
|
+-------------+-------------+-------------+
| | | |
PM2 API PM2 API PM2 API PM2 API
(Cluster) (Cluster) (Cluster) (Cluster)
| | | |
+-------------+-------------+-------------+
|
Redis / MongoDB

这种架构实现了:

  • 应用层面的负载均衡(PM2 Cluster)
  • 服务层面的负载均衡(Nginx/HAProxy)
  • 状态共享(Redis/MongoDB)
  • 高可用性

总结

PM2 是 Node.js 生产环境部署的终极武器,它不仅是一个进程管理器,更是一个完整的生产环境解决方案。核心优势包括:

  • 简单易用:一行命令启动应用,配置简单直观
  • 功能全面:进程管理、负载均衡、日志、监控、开机自启一应俱全
  • 性能优秀:Cluster 模式显著提升应用性能
  • 可靠性高:自动重启、零停机重载确保服务可用性
  • 生态成熟:100M+ 下载量,社区活跃,文档完善

适用场景

  • 生产环境的 Node.js 应用部署
  • 高并发的 API 服务
  • 微服务架构
  • 需要高可用性的应用

注意事项

  • Cluster 模式要求应用无状态
  • 使用外部存储(Redis、MongoDB)共享状态
  • 配置优雅关闭确保数据安全
  • 合理配置内存限制防止内存泄漏

学习资源

无论你是个人开发者还是团队运维,PM2 都是 Node.js 生产环境部署的不二之选。让 PM2 成为你的生产环境武器,专注于业务逻辑而非运维细节。