Node.js 服务开发完成后,如何稳定地运行在生产环境是每个后端开发者都要面对的课题。使用 nohup 或直接 node app.js 显然不够可靠——进程崩溃无人拉起、日志无处可查、重启服务还要手动操作。
PM2 是 Node.js 生态中最流行的进程管理器,本文介绍它的核心用法与生产实践。
一、为什么需要进程管理器
- 自动重启:进程意外崩溃时自动拉起,保障服务可用性
- 守护运行:SSH 断开后服务继续运行
- 日志管理:统一收集 stdout/stderr 日志,支持日志轮转
- 开机自启:服务器重启后自动恢复服务
- 负载均衡:支持 cluster 模式多实例运行
二、安装与启动
# 全局安装
npm install -g pm2
# 启动应用
pm2 start app.js --name myapp
# 查看进程列表
pm2 list
# 查看日志
pm2 logs myapp
# 查看实时指标
pm2 monit
启动后应使用 pm2 save 保存当前进程列表,再执行 pm2 startup 生成开机自启脚本:
pm2 save
pm2 startup
PM2 会输出一行需要以 root 权限执行的命令,复制粘贴执行即可完成开机自启配置。
三、生产环境常用配置
推荐使用配置文件 ecosystem.config.js 管理应用参数,便于团队统一:
// ecosystem.config.js
module.exports = {
apps: [{
name: 'myapp',
script: 'src/app.js',
instances: 1, // 单实例,避免 SQLite 等单机资源的锁冲突
exec_mode: 'fork',
max_memory_restart: '300M', // 内存超限自动重启
env: {
NODE_ENV: 'production',
PORT: 3000,
},
log_date_format: 'YYYY-MM-DD HH:mm:ss',
error_file: '/var/log/myapp/error.log',
out_file: '/var/log/myapp/out.log',
merge_logs: true,
}]
};
pm2 start ecosystem.config.js
max_memory_restart 是防止内存泄漏的利器,超过设定值后 PM2 会自动重启进程并记录日志。
四、日志管理与轮转
生产日志如果不做轮转会撑爆磁盘。安装 PM2 日志模块:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
以上配置表示单文件超过 50M 自动切割、保留 30 份、切割后压缩,有效控制日志占用空间。
五、部署与发布流程
每次发版建议使用 reload 实现零停机更新(cluster 模式下逐个实例重启):
# 上传代码后
pm2 reload myapp
对于单实例 fork 模式,可用 pm2 restart。还可以配置 PM2 自动监控代码变化:
pm2 start app.js --watch # 代码变化自动重启
但生产环境不建议开 --watch,更推荐用 CI/CD 流程:构建 → 测试 → 部署 → pm2 reload。
六、常用运维命令速查
| 命令 | 说明 |
|---|---|
pm2 list | 查看所有进程状态 |
pm2 logs --lines 100 | 查看最近 100 行日志 |
pm2 monit | 实时监控 CPU / 内存 |
pm2 restart all | 重启全部进程 |
pm2 stop <app> | 停止指定进程 |
pm2 delete <app> | 从进程列表移除 |
pm2 save | 保存进程列表 |
小结
PM2 让 Node.js 生产部署变得简单可靠。配合 Nginx 反向代理、日志轮转和监控告警,就能构建一套基本完善的线上服务运行体系。建议新手先从单实例 + PM2 入手,理解进程守护的核心思想。