Node.js 生产环境部署必备:PM2 从入门到实战全解析

一、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%触发报警
原文链接:,转发请注明来源!