PM2 从基础到进阶完全指南

PM2(Process Manager 2)是 Node.js 生态中最流行、功能最强大的进程管理工具,它不仅能让 Node.js 应用在后台稳定运行、自动重启,还支持集群模式(利用多核 CPU)、日志管理、实时监控、一键部署等高级功能,是 Node.js 应用生产环境部署的标配工具。

本文将从基础安装、常用命令,到配置文件、集群模式、日志管理、监控、部署、性能优化,全面讲解 PM2 的用法,附完整可运行示例,帮你快速掌握 PM2。


一、PM2 是什么?核心优势

PM2 是一个守护进程管理器,它的核心价值在于:

  1. 进程守护:应用崩溃/异常退出时自动重启,保证服务高可用
  2. 集群模式:一键启动多个应用实例,利用多核 CPU,提升并发能力
  3. 日志管理:自动收集、聚合、轮转日志,避免日志文件过大
  4. 实时监控:终端/Web 端监控应用的 CPU、内存、重启次数等
  5. 一键部署:通过 Git 拉取代码、安装依赖、重启应用,实现自动化部署
  6. 零停机重启:集群模式下支持“零停机重载”,更新代码不中断服务
  7. 跨平台:支持 Linux、macOS、Windows

二、基础篇:安装与常用命令

1. 安装 PM2

PM2 推荐全局安装,方便在任何目录下使用:

1
2
3
4
5
6
# 全局安装 PM2(最新稳定版)
npm install pm2 -g

# 检查安装是否成功
pm2 -v
# 或 pm2 --version

2. 核心概念

在使用命令前,先了解几个核心概念:

  • 应用(App):PM2 管理的一个进程(如一个 Node.js 应用)
  • 实例(Instance):一个应用可以启动多个实例(集群模式)
  • 进程 ID(PID):系统分配给进程的唯一 ID
  • PM2 ID:PM2 内部给应用分配的 ID(从 0 开始)
  • 名称(Name):应用的自定义名称(推荐设置,方便管理)

3. 常用命令速查

命令分类 命令 说明
启动应用 pm2 start app.js 启动一个 Node.js 应用
pm2 start app.js --name my-app 启动并指定应用名称
pm2 start app.js --watch 启动并开启文件监听(代码修改自动重启)
pm2 start app.js --max-memory-restart 500M 内存超过 500M 自动重启
pm2 start app.js --env production 指定环境变量为 production
查看应用 pm2 list 查看所有应用列表(最常用)
pm2 ls 同上,简写
pm2 show my-app 查看指定应用的详细信息
pm2 info my-app 同上,简写
日志管理 pm2 logs 查看所有应用的实时日志
pm2 logs my-app 查看指定应用的实时日志
pm2 logs --lines 100 查看最后 100 行日志
pm2 logs --err 仅查看错误日志
pm2 flush 清空所有日志
重启/重载 pm2 restart my-app 重启指定应用(会中断服务)
pm2 restart all 重启所有应用
pm2 reload my-app 零停机重载(集群模式下推荐,不中断服务)
pm2 reload all 零停机重载所有应用
停止/删除 pm2 stop my-app 停止指定应用
pm2 stop all 停止所有应用
pm2 delete my-app 删除指定应用(从 PM2 列表中移除)
pm2 delete all 删除所有应用
监控 pm2 monit 终端实时监控(CPU、内存、日志)
pm2 plus 打开 Web 监控面板(PM2 Plus,付费版)
其他 pm2 save 保存当前应用列表(用于开机自启)
pm2 startup 生成开机自启脚本
pm2 update 升级 PM2 并保留应用列表
pm2 kill 杀死 PM2 守护进程(会停止所有应用)

三、基础命令详解:最常用的操作

1. 启动应用:多种启动方式

(1)基础启动

1
2
3
4
5
# 启动一个 Node.js 应用
pm2 start app.js

# 启动并指定应用名称(推荐,方便后续管理)
pm2 start app.js --name my-express-app

(2)带参数启动

1
2
3
4
5
6
7
8
9
10
11
# 开启文件监听:代码修改自动重启(开发环境推荐)
pm2 start app.js --name my-app --watch

# 忽略监听的目录(避免 node_modules 变化触发重启)
pm2 start app.js --name my-app --watch --ignore-watch="node_modules logs"

# 内存限制:超过 500M 自动重启(防止内存泄漏)
pm2 start app.js --name my-app --max-memory-restart 500M

# 指定环境变量
pm2 start app.js --name my-app --env production

(3)启动非 Node.js 应用

PM2 不仅能管理 Node.js 应用,还能管理 Python、Shell 等其他进程:

1
2
3
4
5
# 启动 Python 应用
pm2 start app.py --name my-python-app --interpreter python3

# 启动 Shell 脚本
pm2 start script.sh --name my-shell-script

2. 查看应用:pm2 list / pm2 show

(1)pm2 list:查看应用列表

这是最常用的命令,执行后会显示:

  • id:PM2 内部 ID
  • name:应用名称
  • namespace:命名空间(默认 default)
  • version:应用版本(从 package.json 读取)
  • mode:模式(fork 或 cluster)
  • pid:系统进程 ID
  • uptime:运行时间
  • status:状态(online/stopped/errored)
  • cpu:CPU 使用率
  • mem:内存使用量
  • user:运行用户
  • watching:是否开启文件监听

(2)pm2 show:查看应用详情

1
2
3
# 查看指定应用的详细信息(通过名称或 ID)
pm2 show my-app
pm2 show 0

会显示应用的路径、日志路径、环境变量、重启次数、错误次数等详细信息。

3. 日志管理:pm2 logs

PM2 会自动收集应用的 stdout(标准输出)和 stderr(标准错误)日志,默认存放在 ~/.pm2/logs/ 目录下。

(1)查看日志

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

# 查看指定应用的实时日志
pm2 logs my-app

# 查看最后 100 行日志(不实时)
pm2 logs --lines 100

# 仅查看错误日志
pm2 logs --err

# 仅查看输出日志
pm2 logs --out

# 退出日志查看:Ctrl + C

(2)清空日志

1
2
3
4
5
# 清空所有应用的日志
pm2 flush

# 清空指定应用的日志
pm2 flush my-app

4. 重启/重载:pm2 restart / pm2 reload

(1)pm2 restart:重启(会中断服务)

1
2
3
4
5
# 重启指定应用
pm2 restart my-app

# 重启所有应用
pm2 restart all

restart 会先停止应用,再重新启动,会短暂中断服务,适合开发环境或非关键应用。

(2)pm2 reload:零停机重载(推荐生产环境)

1
2
3
4
5
# 零停机重载指定应用(仅集群模式有效)
pm2 reload my-app

# 零停机重载所有应用
pm2 reload all

reload逐个重启实例,保证始终有实例在运行,不中断服务,生产环境强烈推荐!

注意:reload 仅在集群模式mode: 'cluster')下有效,fork 模式下会退化为 restart

5. 停止/删除:pm2 stop / pm2 delete

1
2
3
4
5
6
7
8
9
10
11
# 停止指定应用(保留在 PM2 列表中,可重新启动)
pm2 stop my-app

# 停止所有应用
pm2 stop all

# 删除指定应用(从 PM2 列表中移除,无法重新启动)
pm2 delete my-app

# 删除所有应用
pm2 delete all

四、进阶篇:配置文件 ecosystem.config.js

当应用越来越多、配置越来越复杂时,用命令行参数管理会很麻烦,PM2 推荐使用配置文件(默认 ecosystem.config.js)来管理所有应用的配置。

1. 生成配置文件

1
2
# 在当前目录生成 ecosystem.config.js
pm2 init

2. 完整配置文件示例

这是一个包含所有常用选项的配置文件,可直接复制使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
module.exports = {
/**
* 应用配置:可以配置多个应用,每个应用是一个对象
*/
apps: [
{
// 应用名称(必填)
name: 'my-express-app',

// 应用入口文件(必填)
script: './app.js',

// 应用根目录(可选)
cwd: './',

// 实例数量:'max' 表示利用所有 CPU 核心,或指定数字(如 4)
instances: 'max',

// 运行模式:'cluster'(集群模式,推荐)或 'fork'(默认)
exec_mode: 'cluster',

// 环境变量(通用)
env: {
NODE_ENV: 'development',
PORT: 3000,
DEBUG: 'app:*'
},

// 生产环境变量(通过 --env production 启用)
env_production: {
NODE_ENV: 'production',
PORT: 8080,
DEBUG: ''
},

// 测试环境变量(通过 --env test 启用)
env_test: {
NODE_ENV: 'test',
PORT: 3001
},

// 日志配置
log_date_format: 'YYYY-MM-DD HH:mm:ss Z', // 日志时间格式
error_file: './logs/error.log', // 错误日志路径
out_file: './logs/out.log', // 输出日志路径
combine_logs: true, // 合并所有实例的日志
merge_logs: true, // 同上,旧版写法

// 监听配置
watch: false, // 是否开启文件监听(生产环境建议关闭)
ignore_watch: [ // 忽略监听的目录/文件
'node_modules',
'logs',
'.git',
'*.log'
],
watch_options: { // 监听选项
followSymlinks: false
},

// 重启策略
max_memory_restart: '500M', // 内存超过 500M 自动重启
min_uptime: '10s', // 应用至少运行 10 秒才算启动成功
max_restarts: 10, // 最大重启次数(超过 10 次停止重启)
autorestart: true, // 是否自动重启(默认 true)

// 其他
interpreter: 'node', // 解释器(默认 node,可指定 node 版本)
interpreter_args: '', // 解释器参数(如 --harmony)
args: '', // 应用参数
kill_timeout: 5000, // 停止应用时的超时时间(毫秒)
wait_ready: false, // 是否等待应用发送 'ready' 信号
listen_timeout: 8000, // 等待应用启动的超时时间(毫秒)
cron_restart: '', // 定时重启(Cron 表达式,如 '0 0 * * *' 每天凌晨重启)
vizion: true, // 是否启用版本控制(从 package.json 读取版本)
autostart: true // 是否随 PM2 启动自动启动
},

// 可以配置第二个应用
{
name: 'my-python-app',
script: './app.py',
interpreter: 'python3',
instances: 2,
exec_mode: 'cluster',
env: {
NODE_ENV: 'development'
},
env_production: {
NODE_ENV: 'production'
}
}
],

/**
* 部署配置(可选,用于 pm2 deploy)
*/
deploy: {
// 生产环境部署
production: {
user: 'deploy', // 服务器用户名
host: ['192.168.1.100'], // 服务器地址(可以是多个)
ref: 'origin/main', // Git 分支
repo: 'git@github.com:user/repo.git', // Git 仓库地址
path: '/var/www/my-app', // 服务器上的部署路径
'pre-deploy-local': '', // 本地部署前执行的命令
'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env production', // 部署后执行的命令
'pre-setup': '', // 首次设置前执行的命令
env: {
NODE_ENV: 'production'
}
},

// 测试环境部署
test: {
user: 'deploy',
host: ['192.168.1.101'],
ref: 'origin/develop',
repo: 'git@github.com:user/repo.git',
path: '/var/www/my-app-test',
'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env test',
env: {
NODE_ENV: 'test'
}
}
}
};

3. 使用配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动配置文件中的所有应用
pm2 start ecosystem.config.js

# 启动配置文件中的指定应用
pm2 start ecosystem.config.js --only my-express-app

# 启动并指定环境
pm2 start ecosystem.config.js --env production

# 重启/重载/停止/删除配置文件中的应用
pm2 restart ecosystem.config.js
pm2 reload ecosystem.config.js
pm2 stop ecosystem.config.js
pm2 delete ecosystem.config.js

五、进阶篇:集群模式(利用多核 CPU)

Node.js 是单线程的,默认只能利用一个 CPU 核心,PM2 的集群模式(Cluster Mode)可以一键启动多个实例,利用多核 CPU,大幅提升应用的并发能力。

1. 集群模式的优势

  • 利用多核 CPU:启动多个实例,每个实例运行在一个 CPU 核心上
  • 负载均衡:PM2 自动在多个实例之间负载均衡请求
  • 零停机重启:更新代码时逐个重启实例,不中断服务
  • 高可用:一个实例崩溃,其他实例仍在运行,PM2 自动重启崩溃的实例

2. 配置集群模式

在配置文件中设置:

1
2
3
4
5
6
7
8
9
10
module.exports = {
apps: [{
name: 'my-express-app',
script: './app.js',
// 实例数量:'max' 表示利用所有 CPU 核心,或指定数字(如 4)
instances: 'max',
// 运行模式:必须设为 'cluster'
exec_mode: 'cluster'
}]
};

3. 启动集群模式

1
2
3
4
5
6
# 通过配置文件启动
pm2 start ecosystem.config.js

# 或通过命令行启动
pm2 start app.js --name my-app -i max
# -i 是 --instances 的简写

4. 零停机重载

集群模式下,使用 pm2 reload 实现零停机重载:

1
pm2 reload my-app

六、进阶篇:日志管理与轮转

PM2 会自动收集日志,但如果不做轮转,日志文件会越来越大,占用磁盘空间,推荐使用 pm2-logrotate 模块来做日志轮转。

1. 安装 pm2-logrotate

1
2
# 安装 pm2-logrotate(PM2 模块)
pm2 install pm2-logrotate

2. 配置 pm2-logrotate

1
2
3
4
5
6
7
# 配置日志轮转规则
pm2 set pm2-logrotate:max_size 10M # 单个日志文件最大 10M
pm2 set pm2-logrotate:retain 30 # 保留 30 个日志文件
pm2 set pm2-logrotate:compress true # 压缩旧日志(.gz 格式)
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss # 日志文件名的时间格式
pm2 set pm2-logrotate:rotateInterval '0 0 * * *' # 每天凌晨 0 点轮转(Cron 表达式)
pm2 set pm2-logrotate:rotateModule true # 同时轮转 PM2 自身的日志

3. 查看 pm2-logrotate 配置

1
pm2 conf pm2-logrotate

七、进阶篇:监控与管理

1. 终端监控:pm2 monit

1
2
# 打开终端实时监控面板
pm2 monit

可以实时查看:

  • 每个应用的 CPU、内存使用率
  • 每个应用的日志
  • PM2 自身的状态

退出监控:Ctrl + C

2. Web 监控:PM2 Plus

PM2 Plus 是 PM2 官方的 Web 监控平台(付费版,有免费额度),功能更强大:

  • Web 端实时监控 CPU、内存、磁盘、网络
  • 历史数据统计与图表
  • 告警通知(邮件、Slack、Webhook)
  • 远程管理应用(重启、重载、查看日志)
  • 多服务器管理

使用方式:

1
2
3
4
5
# 登录 PM2 Plus(需要先注册账号:https://pm2.io/)
pm2 plus

# 或
pm2 link

3. PM2 自身管理

1
2
3
4
5
6
7
8
9
10
11
# 升级 PM2(保留应用列表)
pm2 update

# 查看 PM2 版本
pm2 -v

# 查看 PM2 帮助
pm2 --help

# 杀死 PM2 守护进程(会停止所有应用)
pm2 kill

八、进阶篇:一键部署(pm2 deploy)

PM2 内置了部署工具 pm2 deploy,可以通过 Git 拉取代码、安装依赖、重启应用,实现自动化部署。

1. 前置准备

  • 服务器上安装了 Git、Node.js、PM2
  • 本地可以通过 SSH 免密登录服务器
  • 代码托管在 Git 仓库(GitHub、GitLab、Gitee 等)

2. 配置部署

ecosystem.config.js 中配置 deploy 部分(参考上面的完整配置文件)。

3. 部署命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 首次部署(设置服务器环境)
pm2 deploy production setup

# 部署到生产环境
pm2 deploy production

# 部署到测试环境
pm2 deploy test

# 回滚到上一个版本
pm2 deploy production revert 1

# 查看部署日志
pm2 deploy production exec "pm2 logs"

九、进阶篇:开机自启

生产环境需要让 PM2 和应用在服务器重启后自动启动。

1. 生成开机自启脚本

1
2
# 生成开机自启脚本(会自动检测系统类型:systemd、upstart、launchd 等)
pm2 startup

执行后会输出一段命令,复制并执行这段命令,即可设置开机自启。

2. 保存当前应用列表

1
2
# 保存当前 PM2 管理的应用列表(开机后自动启动这些应用)
pm2 save

3. 取消开机自启

1
2
# 取消开机自启
pm2 unstartup

十、性能优化与最佳实践

1. 生产环境最佳实践

  • 使用集群模式instances: 'max',利用多核 CPU
  • 使用配置文件ecosystem.config.js,方便管理
  • 开启日志轮转pm2 install pm2-logrotate,避免日志文件过大
  • 设置内存限制max_memory_restart: '500M',防止内存泄漏
  • 使用零停机重载pm2 reload,更新代码不中断服务
  • 设置开机自启pm2 startup + pm2 save
  • 关闭文件监听watch: false,生产环境不需要
  • 使用 PM2 Plus:监控应用状态,及时发现问题

2. 性能优化

  • 集群模式:利用多核 CPU,提升并发能力
  • 静态资源由 Nginx 处理:不经过 Node.js,提升性能
  • 启用 Gzip 压缩:Nginx 或 Express 的 compression 中间件
  • 启用缓存:Redis 缓存热点数据
  • 避免同步操作:所有 I/O 操作使用异步方式

十一、常见问题排查

1. 应用启动失败

  • 查看应用日志:pm2 logs my-app --err
  • 查看应用详情:pm2 show my-app
  • 检查应用入口文件路径是否正确
  • 检查环境变量是否配置正确
  • 检查端口是否被占用

2. 应用频繁重启

  • 查看应用日志:pm2 logs my-app
  • 检查是否有未捕获的异常
  • 检查内存是否超过限制:max_memory_restart
  • 检查 min_uptime 是否设置过短
  • 检查 max_restarts 是否设置过大

3. 内存泄漏

  • pm2 monit 监控内存使用情况
  • 设置 max_memory_restart,超过限制自动重启
  • 用 Chrome DevTools 或 clinic.js 分析内存泄漏
  • 检查是否有未关闭的数据库连接、文件句柄

4. PM2 命令不生效

  • 检查 PM2 是否在运行:pm2 list
  • 如果 PM2 未运行,先启动 PM2:pm2 resurrect(恢复保存的应用)或 pm2 start ecosystem.config.js
  • 升级 PM2:pm2 update

十二、总结

PM2 是 Node.js 应用生产环境部署的标配工具,它的进程守护、集群模式、日志管理、监控、一键部署等功能,能让 Node.js 应用稳定、高效地运行。

掌握本文的内容,已经可以用 PM2 管理绝大多数 Node.js 应用了。建议大家动手实践一下,跟着步骤配置 ecosystem.config.js,启动集群模式,体验零停机重载,加深理解!

如果需要更高级的功能,可以参考 PM2 官方文档:https://pm2.keymetrics.io/docs/


PM2 从基础到进阶完全指南
https://cszy.top/2017-07-20 pm2/
作者
csorz
发布于
2017年7月20日
许可协议