一、Node.js 为何需要专业的进程管理工具?
作为构建高性能网络应用的首选技术栈,Node.js 凭借事件驱动的异步架构在 I/O 密集型场景中表现优异。但当我们将开发好的应用推向生产环境时,会面临一系列挑战:
- 进程稳定性:Node.js 单进程运行时,代码异常可能导致整个服务崩溃
- 资源利用:多核 CPU 性能无法充分发挥(默认单进程运行)
- 部署效率:手动重启服务、配置环境变量等操作繁琐易错
- 日志管理:缺乏统一的日志收集和监控机制
这时,PM2(Process Manager for Node.js)应运而生。这款明星级进程管理工具,不仅解决了上述痛点,还提供了从开发到生产的全周期管理能力,成为 Node.js 部署的标配方案。
二、PM2 核心功能速览
功能模块 | 核心价值 |
进程守护 | 自动重启崩溃进程,确保服务 7×24 小时运行 |
负载均衡 | 支持集群模式,充分利用多核 CPU,提升吞吐量 |
日志管理 | 统一收集应用日志,支持按日期 / 大小分割,可对接外部日志服务 |
监控报警 | 实时查看 CPU / 内存占用,支持自定义阈值报警 |
部署自动化 | 集成 Git 钩子,实现代码更新自动重启服务 |
资源隔离 | 支持多应用管理,避免进程间资源冲突 |
三、快速上手:PM2 基础操作指南
1. 安装与初始化
# 全局安装 PM2
npm install pm2 -g
# 启动应用(常规模式)
pm2 start app.js --name "my-api" # 指定进程名称
# 启动应用(集群模式,自动根据 CPU 核数fork进程)
pm2 start app.js -i max --name "my-api-cluster"
#启动npm命令,注意start前面的空格
pm2 start npm --name "my-api" -- start
#启动yarn命令
pm2 start yarn --name "my-api" -- run start
2. 常用管理命令
pm2 list # 查看所有运行进程
pm2 show [id|name] # 查看进程详细信息
pm2 stop [id|name] # 停止指定进程
pm2 restart [id|name] # 重启指定进程
pm2 reload [id|name] # 平滑重启(适用于集群模式,无中断更新)
pm2 delete [id|name] # 删除进程(从列表移除)
pm2 logs # 查看所有进程日志
pm2 monit # 实时监控进程资源占用
3. 配置文件进阶(ecosystem.config.js)
推荐使用配置文件管理复杂应用,创建 ecosystem.config.js:
module.exports = {
apps: [{
name: 'my-api',
script: 'app.js', // 主入口文件
env: {
NODE_ENV: 'development' // 开发环境变量
},
env_production: {
NODE_ENV: 'production', // 生产环境变量
PORT: 8080
},
instances: 'max', // 集群实例数,'max' 表示CPU核心数
autorestart: true, // 自动重启
watch: false, // 关闭文件监控(生产环境建议关闭)
max_memory_restart: '1G', // 内存超过1G时自动重启
log_file: './logs/app.log', // 自定义日志文件
error_file: './logs/err.log',
out_file: './logs/out.log'
}]
};
启动配置文件:
pm2 start ecosystem.config.js --env production # 指定环境
四、生产环境最佳实践
1. 集群模式深度优化
// 支持动态切换集群/单例模式的代码示例
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// 主进程管理工作进程
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died, restarting...`);
cluster.fork(); // 自动重启崩溃的工作进程
});
} else {
// 工作进程运行实际服务
require('./app.js');
}
通过 pm2 start app.js -i max 即可启动集群模式,PM2 会自动管理主从进程。
2. 日志管理最佳实践
pm2 logs # 实时查看合并日志
pm2 logs my-api # 查看指定应用日志
pm2 flush # 清空日志
pm2 rotate # 按规则分割日志(基于配置文件设置)
# 对接外部日志服务(如 Winston)
const winston = require('winston');
winston.add(new winston.transports.File({ filename: 'combined.log' }));
#日志自动分割
pm2 install pm2-logrotate
#pm2-logrotate工具怎么分割日志可自行百度
3. 开机自启动
pm2 save # 保存当前进程状态
pm2 startup # 生成开机启动脚本
# 根据提示执行相应命令(如 systemd/upstart 等)
#windows下自启动使用以下命令
npm install pm2-windows-startup -g
pm2-startup install
#其他的操作与linux下一致
4. 监控与报警配置
pm2 monit # 图形化监控界面
pm2 install pm2-alert # 安装报警插件
pm2 set pm2-alert:email xxx@example.com # 设置报警邮箱
pm2 alert add cpu 80 # CPU占用超过80%触发报警