PM2 是 Node.js 生态中最流行的进程管理工具,能让 Node.js 应用在后台持久运行、崩溃自动重启、开机自启,并提供日志聚合与集群模式。无论是小型 API 服务还是 Express/Koa 应用,PM2 都是部署到 VPS 的首选守护方案。

本文要点

  • 安装 Node.js 与 PM2
  • 启动、停止、重载应用
  • 配置开机自启
  • 查看日志与日志切割
  • 集群模式充分利用多核 CPU

安装 Node.js 与 PM2

推荐用 NodeSource 的官方脚本安装指定版本的 Node.js(以 LTS v22 为例):

# 安装 Node.js 22 LTS
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
node --version
npm --version

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

推荐使用 nvm 管理版本

若需要在同一台服务器跑多个不同 Node.js 版本的项目,推荐安装 nvm 来切换版本,PM2 配合 nvm 也能正常工作。

启动应用

假设你的应用入口文件是 /opt/myapp/app.js

# 最简单的启动方式
pm2 start /opt/myapp/app.js --name myapp

# 指定环境变量与工作目录
pm2 start /opt/myapp/app.js \
  --name myapp \
  --cwd /opt/myapp \
  --env production

# 查看运行状态
pm2 status
pm2 show myapp

常用操作命令

命令说明
pm2 start app.js --name myapp启动应用
pm2 stop myapp停止应用
pm2 restart myapp重启应用
pm2 reload myapp零停机热重载(用于更新代码)
pm2 delete myapp从 PM2 列表中移除
pm2 list查看所有应用状态
pm2 monit实时监控面板

使用 ecosystem.config.js 文件管理

对于正式项目,推荐用配置文件替代命令行参数:

// /opt/myapp/ecosystem.config.js
module.exports = {
  apps: [{
    name: "myapp",
    script: "./app.js",
    cwd: "/opt/myapp",
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: "300M",
    env_production: {
      NODE_ENV: "production",
      PORT: 3000,
    },
  }],
};
# 使用配置文件启动
pm2 start ecosystem.config.js --env production

配置开机自启

PM2 生成 systemd 开机启动配置只需两步:

# 生成并应用开机启动命令(按提示执行输出的命令)
pm2 startup
# 保存当前进程列表,下次开机时自动恢复
pm2 save

save 不能忘

pm2 startup 只是注册了服务,pm2 save 才把当前应用列表写入磁盘。两条都执行后,重启服务器验证一次,确认应用自动恢复。

日志管理

# 实时查看日志
pm2 logs myapp

# 查看最近 100 行
pm2 logs myapp --lines 100

# 清空日志
pm2 flush

# 安装日志切割模块(防止日志无限增长)
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7

集群模式

对于 CPU 密集型或高并发的 HTTP 服务,集群模式能充分利用多核 CPU:

# instances: "max" 表示使用所有 CPU 核心
pm2 start app.js --name myapp -i max

# 或在 ecosystem.config.js 中设置
// instances: "max"  // 所有核心
// instances: 4      // 指定 4 个进程

零停机部署

更新代码后,执行 pm2 reload myapp(非 restart)可以逐个重启进程,整个过程中服务不中断,实现零停机部署。

小结

  • PM2 = 守护 + 自启 + 日志 + 集群,一站式解决
  • ecosystem.config.js 让配置可版本控制、可复用
  • 开机自启必须执行 pm2 startup && pm2 save 两步
  • pm2-logrotate 防止日志撑满磁盘

常见问题

pm2 restart 和 pm2 reload 有什么区别?

restart 会先停止所有进程再全部重启,有短暂中断;reload 逐个重启进程,整个过程服务持续可用,适合生产环境更新代码。

进程崩溃了 PM2 会自动重启吗?

会。PM2 的 autorestart 默认为 true,进程异常退出后会自动重启;可在 ecosystem 配置中设置 max_restarts 限制最大重启次数,避免持续崩溃循环。

如何查看某个应用的错误日志?

执行 pm2 logs myapp 会同时显示 stdout 和 stderr;错误日志文件路径可通过 pm2 show myapp 查看(通常在 ~/.pm2/logs/)。