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 入手,理解进程守护的核心思想。