Skip to content

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)会逐个替换进程:

  1. 先启动一个新的进程
  2. 等新进程启动成功后,再停止旧的进程
  3. 用户全程无感知

什么时候用?

  • 更新代码后重新部署
  • 修改环境变量后重启
  • 生产环境必须用 reload 而不是 restart
bash
# 零停机重载(集群模式)
pm2 reload my-app

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

常见问题

应用崩溃不自动重启

检查 max_memory_restartrestart_delay 配置:

js
{
  name: 'my-app',
  script: './app.js',
  max_memory_restart: '1G',
  restart_delay: 3000,
  max_restarts: 10,
}

查看进程状态

bash
# 进程状态说明:
# online  - 正常运行
# stopped - 已停止
# errored - 出错
# launching - 启动中

参考

个人学习笔记,部分内容借助 AI 辅助整理,仅供查阅参考,请以官方文档为准