2026-02-26•ToolBox Team
PM2 完全指南 - Node.js 生产环境进程管理
📌 相关工具推荐 | Related Tool
⚙️tools.cronGeneratornodejspm2devopsmonitoring
PM2 完全指南 - Node.js 生产环境进程管理
当 Node.js 应用从本地开发进入生产环境,光靠 npm start 远远不够。我们需要一个强大的进程管理工具,PM2 正是这样的利器。
为什么不能直接用 Node.js 运行?
在生产环境中,直接运行 node app.js 会面临多个问题:
- 应用崩溃后无法自动恢复:一旦出错,整个服务离线
- 无法充分利用多核 CPU:单进程只能用一个核心
- 日志难以管理和追踪:标准输出日志容易丢失
- 无法实时监控应用状态:无法及时发现问题
- 更新代码需要手动重启:遗漏重启导致版本不一致
PM2 完美解决了这些问题。
PM2 安装与基础使用
安装
npm install -g pm2
启动应用
pm2 start app.js --name "my-app"
这条命令:
- 以 PM2 托管方式启动
app.js - 给应用起名为
my-app - 自动保存进程信息到 PM2 数据库
查看运行状态
pm2 list
输出示例:
id │ name │ namespace │ version │ mode │ pid │ status
0 │ my-app │ default │ 1.0.0 │ fork │ 12345 │ online
停止、重启、删除
pm2 stop my-app # 停止应用
pm2 restart my-app # 重启应用
pm2 delete my-app # 删除应用
核心特性深度剖析
1. 集群模式 - 充分利用多核 CPU
单进程模式只能利用一个 CPU 核心,而集群模式可以启动多个进程分担负载。
pm2 start app.js --name "my-app" -i max
参数说明:
-i参数指定进程数max表示根据 CPU 核心数自动启动相同数量的进程- 也可以手动指定:
-i 4启动 4 个进程
查看集群状态:
pm2 list
输出示例:
id │ name │ mode │ pid │ status
0 │ my-app │ cluster │ 12345 │ online
1 │ my-app │ cluster │ 12346 │ online
2 │ my-app │ cluster │ 12347 │ online
3 │ my-app │ cluster │ 12348 │ online
Nginx 会自动轮询分配请求到这 4 个进程。
2. 自动重启机制
应用崩溃自动恢复
pm2 start app.js --max-memory-restart 500M
如果应用内存占用超过 500MB,PM2 会自动重启它。
文件监听与自动重载
开发阶段,代码修改后自动重启应用:
pm2 start app.js --watch
忽略某些目录:
pm2 start app.js --watch --ignore-watch="node_modules|logs"
3. 完整的配置文件
创建 ecosystem.config.js:
module.exports = {
apps: [
{
name: 'web-app',
script: './app.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production'
},
error_file: './logs/err.log',
out_file: './logs/out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
merge_logs: true,
max_memory_restart: '500M',
watch: false,
ignore_watch: ['node_modules', 'logs'],
max_restarts: 10,
min_uptime: '10s',
autorestart: true,
// 优雅关闭配置
kill_timeout: 5000,
listen_timeout: 3000,
}
]
};
启动应用:
pm2 start ecosystem.config.js
4. 日志管理
查看实时日志:
pm2 logs my-app
查看历史日志:
pm2 logs my-app --lines 100
清空日志:
pm2 flush
重要提示:生产环境应该采用结构化日志(JSON 格式),便于分析和聚合。可以用 Winston 或 Pino 库增强日志功能。
5. 实时监控
启动监控仪表板:
pm2 monit
这会显示:
- 实时 CPU 和内存使用率
- 应用状态和重启次数
- 运行时间
生产环境最佳实践
1. 优雅关闭 (Graceful Shutdown)
应用应该监听 SIGTERM 信号,完成现有请求后再退出:
process.on('SIGTERM', async () => {
console.log('收到关闭信号,开始优雅关闭...');
// 停止接收新请求
server.close(() => {
console.log('HTTP 服务器已关闭');
});
// 关闭数据库连接
await db.close();
// 清理资源
process.exit(0);
});
配置文件中设置超时时间:
kill_timeout: 5000, // 5秒超时后强制杀进程
2. 系统启动时自动启动 PM2
pm2 startup
这会生成一个 systemd 服务,系统重启后自动启动 PM2 应用。
3. 保存进程列表
pm2 save
记录当前运行的所有应用,系统重启后会自动恢复。
4. 依赖管理
如果应用依赖其他服务(如数据库),可以定义依赖关系:
{
name: 'api',
script: './api.js',
depends_on: ['database']
}
5. 环境变量隔离
module.exports = {
apps: [
{
name: 'api-dev',
script: './app.js',
env: { NODE_ENV: 'development' }
},
{
name: 'api-prod',
script: './app.js',
env: { NODE_ENV: 'production' }
}
]
};
常见问题解决
进程频繁重启
原因:应用启动失败或返回非零退出码
解决:检查日志找出错误,确保依赖服务已启动
pm2 logs my-app --err
内存持续增长
原因:内存泄漏
解决:使用内存分析工具定位泄漏,检查是否创建了未释放的对象
pm2 start app.js --max-memory-restart 1G
无法重启应用
原因:端口被占用或权限不足
解决:查看进程占用的端口
pm2 describe my-app # 查看进程信息
netstat -tulpn | grep 3000 # 查看端口占用
与 Docker + Nginx 集成
PM2 常与 Docker 和 Nginx 配合使用,构建完整的生产环境:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install -g pm2 && npm install
COPY . .
EXPOSE 3000
# 启动 PM2
CMD ["pm2-runtime", "start", "ecosystem.config.js"]
使用 pm2-runtime 确保 PM2 前台运行,Docker 能正确跟踪进程。
相关工具推荐: