PM2 是一个功能强大的 Node.js 进程管理器,它可以帮助你保持应用程序永远运行,并提供负载均衡、日志管理、性能监控等高级功能。无论是在开发环境还是生产环境,PM2 都是 Node.js 开发者不可或缺的工具。本章将深入讲解 PM2 的安装、配置和使用。
PM2(Process Manager 2)是一个守护进程管理器,专门用于 Node.js 应用。它可以:
PM2 是一个 npm 包,可以全局安装:
npm install -g pm2
安装完成后,验证版本:
pm2 --version
如果你希望开机自启,PM2 提供了相应的命令(后续介绍)。
使用 pm2 start 命令启动你的 Node.js 应用。例如,启动 app.js:
pm2 start app.js
也可以为应用指定名称:
pm2 start app.js --name my-api
启动后,PM2 会分配一个 ID 和名称,你可以通过 ID 或名称管理进程。
常用的启动选项:
--watch:监听文件变化,自动重启(开发环境有用)。--ignore-watch:忽略某些文件或文件夹。--max-memory-restart:当内存使用超过指定值时重启(如 --max-memory-restart 200M)。--log:指定日志文件路径。--output / --error:分别指定标准输出和错误日志文件。以下是一些日常管理中最常用的 PM2 命令。
pm2 list
显示所有由 PM2 管理的进程的状态、CPU/内存使用等信息。
pm2 show <id|name>
显示指定进程的详细信息,包括重启次数、日志路径、环境变量等。
pm2 stop <id|name> # 停止指定进程
pm2 stop all # 停止所有进程
pm2 restart <id|name>
pm2 delete <id|name>
pm2 logs # 查看所有进程日志
pm2 logs my-api # 查看指定进程日志
pm2 logs --lines 100 # 显示最近100行
pm2 monit
启动一个实时监控终端界面,显示 CPU、内存使用情况。
PM2 可以保存当前进程列表,并在系统重启后自动恢复:
pm2 save # 保存当前进程列表
pm2 resurrect # 恢复保存的进程列表
pm2 startup # 生成开机自启脚本
pm2 startup 会输出一条命令,你需要以 root 身份执行它来启用开机自启。
PM2 支持集群模式,可以启动多个进程实例,利用多核 CPU。这在 Node.js 单线程模型下尤其有用,可以显著提升性能。
启动集群模式:
pm2 start app.js -i max # 根据 CPU 核心数启动相应数量的实例
pm2 start app.js -i 4 # 启动 4 个实例
-i 参数指定实例数,max 表示使用所有核心。PM2 会自动内置负载均衡(使用 Node.js 的 cluster 模块),将请求分发到各个实例。
对于复杂的应用,推荐使用配置文件来管理启动选项。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
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 # 压缩归档
除了 pm2 monit 实时监控外,PM2 还集成了 Keymetrics(现为 PM2 Plus),提供远程监控、告警和性能分析服务。不过基础版已足够。
也可以使用 pm2 status 查看简要状态,或用 pm2 prettylist 输出 JSON 供其他工具处理。
PM2 支持重载(reload)实现零停机更新。在集群模式下,使用 pm2 reload 会逐个重启进程,确保服务不中断。
pm2 reload app-name
如果是单实例应用,可以使用 pm2 gracefulReload,需要应用自行处理优雅退出(如关闭连接)。
在配置文件中可以针对不同环境设置环境变量(如上面的 env 和 env_production)。也可以通过命令行传递:
pm2 start app.js --env production
PM2 还支持从 .env 文件加载环境变量,但需要额外配置或使用 dotenv 在代码中加载。
pm2 prettylist 输出 JSON,可用 jq 解析。pm2 reset <id>npm install -g pm2@latest 然后 pm2 update 更新内存中的进程列表。ecosystem.config.js 中,并纳入版本控制。max_memory_restart 防止内存泄漏导致应用崩溃。pm2 startup 确保服务器重启后应用自动恢复。pm2 reload 而不是 pm2 restart,避免服务中断。假设我们有一个 Express 应用 app.js,需要部署到生产服务器。步骤如下:
npm install -g pm2ecosystem.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'
}]
};
pm2 start ecosystem.config.jspm2 savepm2 startup 并按提示执行命令。pm2 status,监控:pm2 monit。pm2 logs app-name。