PM2 进程管理

PM2 是一个功能强大的 Node.js 进程管理器,它可以帮助你保持应用程序永远运行,并提供负载均衡、日志管理、性能监控等高级功能。无论是在开发环境还是生产环境,PM2 都是 Node.js 开发者不可或缺的工具。本章将深入讲解 PM2 的安装、配置和使用。

1. 什么是 PM2?

PM2(Process Manager 2)是一个守护进程管理器,专门用于 Node.js 应用。它可以:

  • 在应用崩溃时自动重启。
  • 管理应用日志,包括日志轮转。
  • 以集群模式利用多核 CPU,实现负载均衡。
  • 提供性能监控和实时指标。
  • 支持应用的无缝重载和零停机部署。
  • 提供丰富的命令行接口和配置文件。

2. 安装 PM2

PM2 是一个 npm 包,可以全局安装:

npm install -g pm2

安装完成后,验证版本:

pm2 --version

如果你希望开机自启,PM2 提供了相应的命令(后续介绍)。

3. 启动应用

使用 pm2 start 命令启动你的 Node.js 应用。例如,启动 app.js

pm2 start app.js

也可以为应用指定名称:

pm2 start app.js --name my-api

启动后,PM2 会分配一个 ID 和名称,你可以通过 ID 或名称管理进程。

3.1 启动选项

常用的启动选项:

  • --watch:监听文件变化,自动重启(开发环境有用)。
  • --ignore-watch:忽略某些文件或文件夹。
  • --max-memory-restart:当内存使用超过指定值时重启(如 --max-memory-restart 200M)。
  • --log:指定日志文件路径。
  • --output / --error:分别指定标准输出和错误日志文件。

4. 常用命令

以下是一些日常管理中最常用的 PM2 命令。

4.1 查看进程列表

pm2 list

显示所有由 PM2 管理的进程的状态、CPU/内存使用等信息。

4.2 查看进程详情

pm2 show <id|name>

显示指定进程的详细信息,包括重启次数、日志路径、环境变量等。

4.3 停止进程

pm2 stop <id|name>   # 停止指定进程
pm2 stop all          # 停止所有进程

4.4 重启进程

pm2 restart <id|name>

4.5 删除进程

pm2 delete <id|name>

4.6 查看日志

pm2 logs               # 查看所有进程日志
pm2 logs my-api         # 查看指定进程日志
pm2 logs --lines 100    # 显示最近100行

4.7 监控仪表盘

pm2 monit

启动一个实时监控终端界面,显示 CPU、内存使用情况。

4.8 保存和恢复进程列表

PM2 可以保存当前进程列表,并在系统重启后自动恢复:

pm2 save               # 保存当前进程列表
pm2 resurrect           # 恢复保存的进程列表
pm2 startup             # 生成开机自启脚本

pm2 startup 会输出一条命令,你需要以 root 身份执行它来启用开机自启。

5. 集群模式

PM2 支持集群模式,可以启动多个进程实例,利用多核 CPU。这在 Node.js 单线程模型下尤其有用,可以显著提升性能。

启动集群模式:

pm2 start app.js -i max  # 根据 CPU 核心数启动相应数量的实例
pm2 start app.js -i 4     # 启动 4 个实例

-i 参数指定实例数,max 表示使用所有核心。PM2 会自动内置负载均衡(使用 Node.js 的 cluster 模块),将请求分发到各个实例。

6. 配置文件 ecosystem.config.js

对于复杂的应用,推荐使用配置文件来管理启动选项。PM2 支持 JavaScript 或 JSON 格式的配置文件,通常命名为 ecosystem.config.js

生成配置文件模板:

pm2 init simple

或者手动创建 ecosystem.config.js

module.exports = {
  apps : [{
    name: 'my-app',
    script: 'app.js',
    instances: 'max',          // 集群模式,使用所有核心
    exec_mode: 'cluster',       // 集群模式
    watch: true,                // 监听文件变化
    ignore_watch: ['node_modules', 'logs'],
    max_memory_restart: '200M', // 超过200M内存重启
    env: {
      NODE_ENV: 'development',
      PORT: 3000
    },
    env_production: {
      NODE_ENV: 'production',
      PORT: 8080
    },
    log_file: 'logs/combined.log',
    error_file: 'logs/err.log',
    out_file: 'logs/out.log'
  }]
};

然后使用配置文件启动:

pm2 start ecosystem.config.js

指定环境:

pm2 start ecosystem.config.js --env production

7. 日志管理

PM2 默认会将标准输出和错误输出重定向到 ~/.pm2/logs 目录下。你可以通过 pm2 logs 查看,也可以配置日志轮转避免文件过大。

PM2 内置了日志轮转模块 pm2-logrotate,需要单独安装:

pm2 install pm2-logrotate

安装后可以配置轮转选项:

pm2 set pm2-logrotate:max_size 10M   # 最大10M
pm2 set pm2-logrotate:retain 30       # 保留30个文件
pm2 set pm2-logrotate:compress true   # 压缩归档

8. 监控和指标

除了 pm2 monit 实时监控外,PM2 还集成了 Keymetrics(现为 PM2 Plus),提供远程监控、告警和性能分析服务。不过基础版已足够。

也可以使用 pm2 status 查看简要状态,或用 pm2 prettylist 输出 JSON 供其他工具处理。

9. 零停机部署

PM2 支持重载(reload)实现零停机更新。在集群模式下,使用 pm2 reload 会逐个重启进程,确保服务不中断。

pm2 reload app-name

如果是单实例应用,可以使用 pm2 gracefulReload,需要应用自行处理优雅退出(如关闭连接)。

10. 环境变量管理

在配置文件中可以针对不同环境设置环境变量(如上面的 envenv_production)。也可以通过命令行传递:

pm2 start app.js --env production

PM2 还支持从 .env 文件加载环境变量,但需要额外配置或使用 dotenv 在代码中加载。

11. 常用技巧

  • 查看进程资源占用pm2 prettylist 输出 JSON,可用 jq 解析。
  • 重置重启计数器pm2 reset <id>
  • 更新 PM2npm install -g pm2@latest 然后 pm2 update 更新内存中的进程列表。
  • 通过 Docker 使用 PM2:在容器中也可以使用 PM2 管理进程,但通常容器本身会作为单进程运行,所以可能需要权衡。

12. 在生产环境中的最佳实践

  • 使用配置文件:将启动选项固化在 ecosystem.config.js 中,并纳入版本控制。
  • 设置内存限制:通过 max_memory_restart 防止内存泄漏导致应用崩溃。
  • 启用日志轮转:避免磁盘被日志填满。
  • 利用集群模式:充分利用多核 CPU,提高吞吐量。
  • 配置开机自启:通过 pm2 startup 确保服务器重启后应用自动恢复。
  • 监控和告警:使用 PM2 Plus 或第三方监控工具(如 Prometheus + Grafana)收集指标。
  • 零停机部署:部署新代码时使用 pm2 reload 而不是 pm2 restart,避免服务中断。

13. 综合示例:部署一个 Express 应用

假设我们有一个 Express 应用 app.js,需要部署到生产服务器。步骤如下:

  1. 安装 PM2:npm install -g pm2
  2. 在项目根目录创建 ecosystem.config.js
module.exports = {
  apps: [{
    name: 'express-app',
    script: 'app.js',
    instances: 'max',
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    max_memory_restart: '500M',
    log_file: '/var/log/pm2/express-app.log',
    error_file: '/var/log/pm2/express-app-error.log',
    out_file: '/var/log/pm2/express-app-out.log'
  }]
};
  1. 启动应用:pm2 start ecosystem.config.js
  2. 保存进程列表:pm2 save
  3. 配置开机自启:pm2 startup 并按提示执行命令。
  4. 查看状态:pm2 status,监控:pm2 monit

14. 常见问题

  • 应用启动失败:检查错误日志 pm2 logs app-name
  • 集群模式下 session 共享问题:由于负载均衡,请求可能分发到不同进程,需要外部 session 存储(如 Redis)。
  • 环境变量未生效:确保在配置文件中正确设置,或者命令行传递。
  • 日志轮转不生效:确认 pm2-logrotate 已安装并配置。
总结: PM2 是 Node.js 生产环境中不可或缺的工具。通过本章的学习,你应该能够熟练使用 PM2 启动、管理、监控和部署 Node.js 应用,并利用集群模式提升性能。结合日志管理、环境变量和零停机部署,可以构建稳定可靠的线上服务。