PM2 管理 Node.js 进程

PM2 是 Node 生产环境进程管理工具:后台运行、守护进程、自动重启、日志、负载均衡集群、开机自启。

前提:已经用 fnm/nvm 装好 Node + npm

1. 安装 pm2

npm install pm2 -g

验证

pm2 --version

2. 基础启动命令

普通启动

# 启动入口文件 app.js,命名服务名叫 myapp
pm2 start app.js --name myapp

# 指定 node 参数
pm2 start app.js --name myapp -- --max-old-space-size=2048

集群模式(多核负载均衡)

# max:根据CPU核心数自动创建进程
pm2 start app.js -i max --name my-cluster
# 指定4个实例
pm2 start app.js -i 4 --name my-cluster

其他启动方式

# 启动 npm script,例如 npm run start
pm2 start npm --name myapp -- run start

# 重启已存在的应用
pm2 restart myapp

# 重载(0停机,集群模式优雅重载,不杀死连接)
pm2 reload myapp

# 停止
pm2 stop myapp

# 删除进程(从pm2列表移除)
pm2 delete myapp

3. 查看状态与日志

# 查看进程列表
pm2 list
pm2 ls

# 实时日志
pm2 logs
# 只看某个应用日志
pm2 logs myapp
# 错误日志
pm2 logs myapp --err
# 限制行数
pm2 logs --lines 200

# 监控面板 cpu/memory
pm2 monit

# 显示应用详情
pm2 show myapp

4. 配置文件 ecosystem.config.js(推荐生产使用)

生成配置模板

pm2 init simple

示例 ecosystem.config.js

module.exports = {
  apps: [
    {
      name: "my-server",
      script: "./app.js",
      instances: "max",      // 集群实例数
      exec_mode: "cluster",  // cluster/fork
      env: {
        NODE_ENV: "production",
        PORT: 3000
      },
      watch: false,          // 生产关闭watch;开发可设true文件变动重启
      max_memory_restart: "300M", // 内存超过自动重启
      out_file: "./logs/out.log",
      error_file: "./logs/err.log",
      merge_logs: true,
      autorestart: true,     // 程序崩溃自动重启
    }
  ]
}

使用配置文件操作:

pm2 start ecosystem.config.js
pm2 restart ecosystem.config.js
pm2 stop ecosystem.config.js
pm2 delete ecosystem.config.js

5. 开机自启(服务器重启自动跑pm2应用)

# 生成开机启动脚本
pm2 startup

# 保存当前pm2进程列表,开机恢复
pm2 save

# 如果想清除保存的进程列表
pm2 resurrect
pm2 cleardump

⚠️ fnm 用户坑点:
pm2 startup 生成的系统服务默认使用系统node,不会读取 shell fnm 环境变量
两种解决:

  1. ecosystem.config.js 指定 interpreter 指向 fnm 的 node 二进制路径
interpreter: "/home/xxx/.fnm/node-versions/v22.14.0/installation/bin/node"
  1. 或者用 pm2 startup 之后,在系统service里手动指定 PATH。

6. 常用命令速查

pm2 list                     # 进程列表
pm2 start|restart|stop|del  # 启动/重启/停止/删除
pm2 reload <app>             # 零停机重载(集群)
pm2 logs                     # 日志
pm2 monit                    # 监控
pm2 save                     # 保存进程快照
pm2 startup                  # 开机自启
pm2 flush                    # 清空全部日志

7. 开发 vs 生产注意点

  • 开发环境:可以开启 watch:true,文件修改自动重启
  • 生产环境务必关闭 watch,避免磁盘IO和意外重启
  • reload 用于集群优雅更新;restart 是硬杀进程重启

8. 常见问题

  1. pm2 启动用的不是 fnm 的 node 版本

pm2是系统服务,不读取shell环境,需要显式指定 interpreter 绝对路径。

  1. 应用不断自动重启
    pm2 logs,大概率代码报错、端口占用、内存溢出。
  2. 日志文件越来越大
    可以搭配 pm2-logrotate 做日志切割:
pm2 install pm2-logrotate