PM2 从入门到精通:Node.js 进程管理的最佳实践
作为前端/Node.js 开发者,你是否遇到过这些问题:npm run dev后台运行自动挂掉、服务器重启后项目需要手动启动、进程崩溃无日志可查、多个 Node 项目管理混乱……
PM2(Process Manager 2)是 Node.js 生态中最流行的进程管理工具,能完美解决以上问题。本文从安装、核心用法、配置优化、实战场景四个维度,带你彻底掌握 PM2 的使用。
一、为什么选择 PM2?
相比nohup/&等临时方案,PM2 有不可替代的优势:
- 🚀进程守护:进程崩溃/服务器重启后自动重启
- 📝日志管理:统一收集 stdout/stderr,支持日志轮转
- ⚡性能监控:实时监控 CPU、内存、请求量等指标
- 🎛️多进程管理:一键启动/停止/重启多个 Node 项目
- 🔄零停机重载:更新代码后无需中断服务即可重启
- 📦跨平台:兼容 Linux/macOS/Windows
二、快速上手:核心安装与基础命令
1. 全局安装 PM2
# npm 安装(推荐)npminstall-gpm2# yarn 安装yarnglobaladdpm2# 验证安装(输出版本号即成功)pm2-v2. 启动第一个项目
# 基础用法:启动 npm 脚本(如 dev/build/start)pm2 startnpm--name"my-app"-- run dev# 简化写法(无自定义名称)pm2 startnpm-- run dev# 直接启动 Node 文件pm2 start app.js--name"api-server"参数说明:
--name "my-app":给进程命名(后续管理更方便)-- run dev:传递给npm的参数(即执行npm run dev)
3. 核心管理命令
| 命令 | 作用 |
|---|---|
pm2 list | 查看所有运行的进程 |
pm2 stop <name/id> | 停止指定进程(如pm2 stop my-app) |
pm2 restart <name/id> | 重启指定进程 |
pm2 delete <name/id> | 停止并删除进程(清理记录) |
pm2 stop all | 停止所有进程 |
pm2 restart all | 重启所有进程 |
pm2 delete all | 删除所有进程 |
4. 日志查看(排障核心)
# 实时查看指定进程日志(推荐)pm2 logs my-app# 查看所有进程日志pm2 logs# 查看最后 100 行日志pm2 logs my-app--lines100# 实时监控日志(类似 tail -f)pm2 logs my-app-f三、进阶配置:用配置文件管理项目
手动输入命令不够优雅?PM2 支持配置文件(JSON/YAML/JS),推荐用ecosystem.config.js统一管理多项目。
1. 生成默认配置文件
# 生成示例配置文件pm2 init simple2. 自定义配置文件(实战版)
创建ecosystem.config.js(放在项目根目录):
module.exports={apps:[// 第一个项目:前端 dev 服务{name:"front-dev",// 进程名script:"npm",// 执行脚本args:"run dev",// npm 参数cwd:"/usr/local/projects/frontend",// 项目根目录instances:1,// 启动实例数(dev 模式建议 1)autorestart:true,// 崩溃自动重启watch:false,// dev 模式不建议开启(避免和 vite/webpack 监听冲突)max_memory_restart:"1G",// 内存超过 1G 自动重启env:{NODE_ENV:"development",// 开发环境变量PORT:3000},// 日志配置output:"./logs/front-out.log",// 标准输出日志error:"./logs/front-err.log",// 错误日志log_date_format:"YYYY-MM-DD HH:mm:ss"// 日志时间格式},// 第二个项目:后端 API 服务{name:"api-server",script:"app.js",// 直接启动 Node 文件cwd:"/usr/local/projects/backend",instances:"max",// 启动尽可能多的实例(多核利用)autorestart:true,watch:true,// 监听文件变化自动重启(生产环境慎用)env:{NODE_ENV:"production",PORT:8080}}]};3. 通过配置文件启动/管理
# 启动配置文件中的所有项目pm2 start ecosystem.config.js# 只启动指定项目pm2 start ecosystem.config.js--onlyfront-dev# 重启配置文件中的项目(配置修改后生效)pm2 restart ecosystem.config.js四、生产环境必备优化
1. 设置 PM2 开机自启
# 生成开机自启配置pm2 startup# 执行上述命令输出的提示命令(如)# sudo env PATH=$PATH:/usr/local/bin pm2 startup systemd -u root --hp /root# 保存当前进程列表(开机后自动恢复)pm2 save2. 日志轮转(避免日志文件过大)
# 安装日志轮转插件pm2installpm2-logrotate# 配置轮转规则(示例:按大小轮转,最大 100M,保留 10 个文件)pm2setpm2-logrotate:max_size 100M pm2setpm2-logrotate:retain10pm2setpm2-logrotate:compresstrue# 压缩旧日志pm2setpm2-logrotate:dateFormat YYYY-MM-DD-HH-mm-ss# 日志命名格式3. 零停机重载(生产环境更新代码)
# 重载进程(不中断服务)pm2 reload my-app# 重载所有进程pm2 reload all4. 监控进程状态
# 实时监控面板(CPU、内存、日志、进程数)pm2 monit# 查看进程详细信息pm2 show my-app# 导出监控数据(JSON 格式)pm2 dump五、常见问题与解决方案
1. PM2 启动npm run dev后自动退出?
- 原因:dev 模式(vite/webpack)依赖终端交互,或端口被占用
- 解决:
// 在 ecosystem.config.js 中添加配置{name:"front-dev",script:"npm",args:"run dev -- --host 0.0.0.0 --force",// 强制启动,忽略终端检测merge_logs:true,// 合并子进程日志kill_timeout:5000,// 延长进程终止超时时间}
2. 权限不足导致日志无法写入?
- 解决:指定有权限的日志目录(如
/tmp),或修改目录权限:mkdir-p/usr/local/projects/frontend/logschmod777/usr/local/projects/frontend/logs
3. PM2 启动后端口未监听?
- 步骤 1:查看日志找错误
pm2 logs my-app - 步骤 2:检查端口是否被占用
lsof -i:3000 - 步骤 3:确认项目根目录
cwd配置正确
六、PM2 常用命令速查表
| 场景 | 命令 |
|---|---|
| 安装 | npm install -g pm2 |
| 启动 npm 脚本 | pm2 start npm --name "app" -- run dev |
| 启动配置文件 | pm2 start ecosystem.config.js |
| 查看进程 | pm2 list |
| 查看日志 | pm2 logs <name> |
| 重启进程 | pm2 restart <name> |
| 开机自启 | pm2 startup && pm2 save |
| 实时监控 | pm2 monit |
| 日志轮转 | pm2 install pm2-logrotate |
总结
- PM2 是 Node.js 进程管理的首选工具,相比
nohup更稳定、功能更全面,尤其适合生产环境; - 核心用法:
pm2 start npm --name "xxx" -- run xxx启动项目,pm2 logs排查问题,配置文件统一管理多项目; - 生产环境必做:设置开机自启、配置日志轮转、使用零停机重载,确保服务高可用。
通过 PM2,你可以彻底告别手动管理 Node 进程的繁琐,让项目部署和维护更高效、更稳定。