PM2 常用命令
PM2 是 Node.js 的进程管理工具,用于在生产环境中保持应用持续运行,支持自动重启、负载均衡、日志管理等。
为什么需要 PM2?
Node.js 应用默认是单进程运行的,存在几个问题:
- 只能用一个 CPU 核心:现代服务器通常有 4 核、8 核甚至更多,单进程浪费了其他核心
- 崩溃后不会自动恢复:如果代码抛出未捕获的异常,进程就挂了,网站就打不开了
- 服务器重启后不会自动运行:服务器重启后需要手动 SSH 上去启动应用
PM2 解决了这些问题:
- 集群模式:利用多核 CPU,提升并发能力
- 自动重启:进程崩溃后自动重启,保证服务持续可用
- 开机自启:服务器重启后自动运行应用
- 日志管理:统一管理应用日志,方便排查问题
安装
bash
# 全局安装
npm install -g pm2
# 查看版本
pm2 -v常用命令
启动应用
bash
# 启动 Node.js 应用
pm2 start app.js
# 启动并指定名称
pm2 start app.js --name my-app
# 启动并指定实例数(集群模式)
pm2 start app.js -i 4
# 自动检测 CPU 核心数启动
pm2 start app.js -i max
# 启动 npm 脚本
pm2 start npm -- run dev
# 指定解释器(运行非 Node.js 应用)
pm2 start app.py --interpreter python
pm2 start app.rb --interpreter ruby
# 使用配置文件启动
pm2 start ecosystem.config.js进程管理
bash
# 查看所有进程
pm2 list
pm2 ls
# 停止指定进程
pm2 stop my-app
pm2 stop 0
# 重启指定进程
pm2 restart my-app
pm2 restart 0
# 停止所有进程
pm2 stop all
# 重启所有进程
pm2 restart all
# 删除指定进程
pm2 delete my-app
pm2 delete 0
# 删除所有进程
pm2 delete all日志管理
bash
# 查看所有日志
pm2 logs
# 查看指定进程日志
pm2 logs my-app
# 查看最后 100 行日志
pm2 logs --lines 100
# 清空日志
pm2 flush
# 实时追踪日志
pm2 logs --follow监控
bash
# 实时监控面板
pm2 monit
# 查看进程详细信息
pm2 show my-app
pm2 describe my-app配置文件
ecosystem.config.js
js
// ecosystem.config.js — PM2 配置文件(集中管理所有应用的启动参数)
module.exports = {
apps: [
{
name: 'my-app', // 应用名称(pm2 list 中显示的名称)
script: './app.js', // 入口文件路径
instances: 'max', // 实例数:'max' = 自动匹配 CPU 核心数,或填数字如 4
exec_mode: 'cluster', // 运行模式:cluster(集群,多进程)或 fork(单进程)
// 环境变量(默认 = development)
env: {
NODE_ENV: 'development', // pm2 start 时默认使用
},
// 生产环境变量(通过 --env production 激活)
env_production: {
NODE_ENV: 'production', // pm2 start --env production 时使用
},
// 日志配置
log_file: './logs/combined.log', // 合并日志(stdout + stderr)
error_file: './logs/error.log', // 错误日志单独输出
out_file: './logs/out.log', // 标准输出日志
log_date_format: 'YYYY-MM-DD HH:mm:ss', // 日志时间格式
// 自动重启配置
watch: false, // 文件变动自动重启(生产环境建议关闭,避免不必要的重启消耗资源)
max_memory_restart: '1G', // 内存超过 1GB 时自动重启(防止内存泄漏)
},
],
}💡
watch: false的原因:生产环境中频繁的文件写入(如日志、临时文件)会触发不必要的重启,导致服务不稳定。开发环境可设为true实现热更新。
使用配置文件
bash
# 使用配置文件启动(推荐,所有参数集中管理)
pm2 start ecosystem.config.js
# 使用生产环境变量启动(会加载 env_production 中的变量)
pm2 start ecosystem.config.js --env production开机自启
什么是开机自启?为什么要配置?
服务器重启后(比如系统更新、云服务商维护),PM2 不会自动运行,你的应用也就不会自动启动。你需要 SSH 上去手动启动,这很麻烦且容易忘记。
配置开机自启后,服务器重启时 PM2 会自动启动并恢复之前运行的应用。
bash
# 第一步:生成启动脚本(PM2 会根据操作系统自动生成 systemd/init.d 脚本)
pm2 startup
# 第二步:保存当前进程列表(必须!否则重启后 PM2 不知道要启动哪些应用)
# 应该在每次启动、停止或删除进程后执行,确保列表是最新的
pm2 save
# 第三步:手动恢复(通常不需要,PM2 启动时会自动加载保存的列表)
# 仅在 PM2 已运行但进程列表丢失时手动执行
pm2 resurrect集群模式
什么是集群模式?为什么要用?
Node.js 默认是单进程的,只能用一个 CPU 核心。如果你的服务器有 4 个核心,只用一个核心意味着浪费了 75% 的性能。
集群模式可以启动多个进程,每个进程用一个核心,PM2 自动分配请求到不同进程:
- 提升并发能力:4 个进程可以同时处理 4 倍的请求
- 利用多核 CPU:把负载分散到所有核心
- 一个进程崩溃不影响其他:某个进程出错,其他进程继续服务
bash
# 启动 4 个实例
pm2 start app.js -i 4
# 自动检测 CPU 核心数启动(推荐)
pm2 start app.js -i max零停机重启
什么是零停机重启?为什么要用?
普通重启(pm2 restart)会先停止进程再启动,中间有短暂的服务中断,用户可能会遇到请求失败。
零停机重启(pm2 reload)会逐个替换进程:
- 先启动一个新的进程
- 等新进程启动成功后,再停止旧的进程
- 用户全程无感知
什么时候用?
- 更新代码后重新部署
- 修改环境变量后重启
- 生产环境必须用
reload而不是restart
bash
# 零停机重载(集群模式)
pm2 reload my-app
# 零停机重载所有应用
pm2 reload all常见问题
应用崩溃不自动重启
检查 max_memory_restart 和 restart_delay 配置:
js
{
name: 'my-app',
script: './app.js',
max_memory_restart: '1G',
restart_delay: 3000,
max_restarts: 10,
}查看进程状态
bash
# 进程状态说明:
# online - 正常运行
# stopped - 已停止
# errored - 出错
# launching - 启动中