Node.js 进程管理 PM2:守护、负载均衡与日志
什么是 PM2?
PM2 是一个带有负载均衡功能的 Node.js 应用的进程守护管理器。它能够让你把 Node.js 应用持久化运行在后台,并在进程崩溃后自动重启。除此之外,PM2 还提供实时监控、日志管理和基于 Cluster 模块的内置负载均衡,是生产环境中管理 Node.js 进程的事实标准。
核心能力一览:
- 进程守护:应用崩溃自动重启,保证服务可用性。
- 负载均衡:利用 Node.js Cluster 模块,在多个 CPU 核心上自动扩展应用。
- 零停机重载:更新代码后不必中断服务。
- 日志管理:自动收集 stdout/stderr,支持日志轮转。
- 进程监控:实时查看 CPU、内存占用和请求状态。
安装 PM2
确保已安装 Node.js 和 npm,然后全局安装 PM2:
npm install pm2 -g
安装完成后验证版本:
pm2 --version
快速启动一个 Node.js 应用
假设有一个最简单的 HTTP 服务 app.js:
const http = require('http');
const port = process.env.PORT || 3000;
const server = http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello from PM2!\n');
});
server.listen(port, () => {
console.log(`Server running on port ${port}`);
});
使用 PM2 启动它:
pm2 start app.js --name my-app
此时应用已在后台运行,不再占用终端窗口。
核心管理命令
掌握下面几个命令,就能完成日常进程管理。
查看进程列表
pm2 list
输出包含应用名称、ID、模式(fork/cluster)、状态、CPU 和内存等信息。
停止与重启
pm2 stop my-app # 停止应用(保留在进程列表)
pm2 restart my-app # 重启应用
pm2 delete my-app # 从 PM2 列表中删除应用
快速重启所有守护进程:
pm2 restart all
保存进程列表与开机自启
当服务器重启后,PM2 进程会消失。通过以下方式让 PM2 记住当前启动的应用,并设置系统自启:
pm2 save # 保存当前进程快照
pm2 startup # 生成开机自启动脚本
执行 pm2 startup 会输出一段系统命令,根据提示复制执行即可完成自启配置。
进程守护:自动重启与错误恢复
PM2 在启动应用后默认会持续监视进程状态。一旦进程发生未捕获的异常退出,PM2 会自动重启它,无需人工干预。
你可以调整重启策略,在应用中有时我们需要延迟重启或限制重启次数:
pm2 start app.js --max-restarts 5 --restart-delay 3000
--max-restarts:连续重启失败超过此次数后停止重启。--restart-delay:两次重启之间的等待时间(毫秒)。
查看应用重启历史:
pm2 show my-app
负载均衡:集群模式
默认情况下,PM2 以 fork 模式 启动应用,只运行一个实例。对于多核 CPU 服务器,可以启用 cluster 模式 充分利用硬件资源。
启动集群模式并指定实例数:
pm2 start app.js -i max --name my-cluster-app
-i max:自动根据 CPU 核心数启动对应数量的实例。- 也可以指定具体数字,如
-i 4启动 4 个进程。
PM2 基于 Node.js 的 cluster 模块自动处理请求分发,无需修改你的应用代码(只要应用是无状态的)。如果应用需要使用 WebSocket 等特性,需要配置 sticky 会话,可通过 PM2 的 --listen-timeout 和 --kill-timeout 配合 sticky 选项实现。
查看每个实例的详情:
pm2 describe my-cluster-app
零停机重载
当更新代码后,期望不中断现有连接,可以使用 reload 代替 restart,尤其对集群模式效果显著:
pm2 reload my-cluster-app
PM2 会逐个重启每个工作进程,始终保持其他进程处理请求,从而实现平滑更新。
日志管理
PM2 自动捕获应用的 console.log 输出以及错误输出,分别保存到日志文件中。
查看日志
实时查看所有日志:
pm2 logs
仅查看某个应用的日志:
pm2 logs my-app
添加 --lines 20 可以显示最后 20 行:
pm2 logs --lines 20
清空日志:
pm2 flush
日志文件位置
默认日志存放在 ~/.pm2/logs/ 下,文件命名如:
my-app-out.log(标准输出)my-app-error.log(错误输出)
日志轮转
生产环境日志会不断增长,需要自动分割和清理。安装 pm2-logrotate 模块:
pm2 install pm2-logrotate
安装后它会使用默认配置自动轮转,你也可以自定义参数:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
使用配置文件
对于复杂的部署,推荐将所有配置写入一个 ecosystem.config.js 文件,便于版本控制和团队共享。
示例配置文件:
module.exports = {
apps: [{
name: 'api-server',
script: './app.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: './logs/api-error.log',
out_file: './logs/api-out.log',
merge_logs: true,
log_date_format: 'YYYY-MM-DD HH:mm Z',
max_restarts: 10,
restart_delay: 4000
}]
};
然后通过下面命令一键启动:
pm2 start ecosystem.config.js
实时监控与仪表盘
在终端中查看带彩色图表的实时监控面板:
pm2 monit
也可以使用基于 Web 的监控工具 pm2-web 或 PM2 官方的 Keymetrics 服务进行远程监控。
总结
PM2 将 Node.js 应用的进程管理从简单的 nohup node app.js & 提升到了企业级水平。通过本教程你应该已经掌握了:
- 如何安装和启动 PM2
- 使用守护特性保障应用永不宕机
- 配置集群模式实现负载均衡
- 管理日志并进行自动轮转
- 用配置文件管理多应用部署
将这些实践应用到你的项目中,可以大大提高 Node.js 服务的稳定性和可维护性。