入门
入门型主机
¥68 /年
2核2G/3M | 个人站点
立即购买
京东云服务器推荐
轻量
轻量云主机
¥158 /年
2核4G | 5M带宽
立即购买
性能
性能型主机
¥750 /年
4核16G | 8M带宽
立即购买

华为云Node.js生产环境PM2进程管理完整配置指南

发布时间:2026-07-17 14:38 作者:admin

在华为云服务器上安装PM2

首先确保华为云弹性云服务器已安装Node.js环境,推荐使用nvm管理版本:

# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc

# 安装Node.js 20 LTS
nvm install 20
nvm use 20

# 全局安装PM2
npm install pm2@latest -g

# 验证安装
pm2 -v

安装完成后,建议配置npm国内镜像源加速后续依赖安装:

npm config set registry https://registry.npmmirror.com

编写生态系统配置文件

不要用命令行参数启动生产应用,使用ecosystem.config.js配置文件可以实现可复现、可版本控制的部署。在项目根目录创建配置文件:

// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'my-node-app',                    // 应用名称,便于PM2管理
    script: 'node_modules/.bin/next',       // 启动脚本路径
    args: 'start',                          // 启动参数
    instances: 'max',                       // 启动实例数,max表示使用所有CPU核心
    exec_mode: 'cluster',                   // 集群模式,实现负载均衡
    watch: false,                           // 生产环境务必关闭文件监听
    max_memory_restart: '500M',             // 内存超过500M自动重启,防止内存泄漏
    node_args: '--max-old-space-size=512',  // Node.js内存限制

    // 环境变量配置
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },

    // 日志配置
    log_date_format: 'YYYY-MM-DD HH:mm:ss',
    error_file: '/var/log/pm2/my-node-app-error.log',
    out_file: '/var/log/pm2/my-node-app-out.log',
    merge_logs: true,                       // 合并集群实例日志

    // 重启策略
    autorestart: true,                      // 崩溃后自动重启
    restart_delay: 3000,                    // 重启间隔3秒,避免频繁重启
    max_restarts: 10,                       // 最大重启次数
    min_uptime: '10s',                      // 至少运行10秒才算启动成功

    // 优雅关闭
    kill_timeout: 5000,                     // 给应用5秒完成正在处理的请求
    listen_timeout: 10000                   // 监听超时时间
  }]
};

配置要点说明:

  • instances: 'max':自动检测CPU核心数并启动对应数量的worker进程
  • exec_mode: 'cluster':集群模式下PM2在worker间做负载均衡,提升并发处理能力
  • watch: false:生产环境绝对不能开启文件监听,否则会导致无限重启循环
  • max_memory_restart:内存泄漏防护,超标自动重启避免服务雪崩

启动应用并配置开机自启

使用生态系统配置文件启动应用:

# 通过配置文件启动
pm2 start ecosystem.config.js

# 查看进程状态
pm2 status

# 查看实时日志
pm2 logs my-node-app

配置开机自启(关键步骤):

# 生成systemd启动脚本
pm2 startup

# 执行上面命令输出的那条sudo命令(类似如下)
sudo env PATH=$PATH:/root/.nvm/versions/node/v20.x.x/bin pm2 startup systemd -u root --hp /root

# 保存当前进程列表
pm2 save

pm2 startup会输出一条需要手动执行的命令,必须复制并执行才能真正设置开机自启。服务器重启后,PM2会自动恢复之前保存的所有应用进程。

PM2日常运维常用命令

操作 命令 说明
查看所有应用状态 pm2 status 显示进程运行状态、CPU和内存占用
零停机重启 pm2 reload my-node-app 集群模式下逐个重启worker,全程无中断
强制重启 pm2 restart my-node-app 会有短暂中断,用于紧急情况
停止应用 pm2 stop my-node-app 停止进程但保留记录
删除应用 pm2 delete my-node-app 从PM2列表中完全移除
查看详细信息 pm2 show my-node-app 显示内存、CPU、重启次数等详情
监控面板 pm2 monit 实时CPU和内存可视化监控
清空日志 pm2 flush my-node-app 清空该应用所有日志
更新环境变量 pm2 restart ecosystem.config.js --update-env 重新读取环境变量后重启

pm2 reloadpm2 restart的区别:

reload在集群模式下逐个重启worker,旧worker处理完当前请求后退出,新worker就绪后接管流量,实现零停机。restart则同时终止所有worker再启动,会有短暂服务中断。生产环境更新代码时务必使用reload

日志管理与轮转配置

防止日志文件无限增长占用磁盘空间,安装PM2日志轮转插件:

# 安装日志轮转插件
pm2 install pm2-logrotate

# 配置日志大小限制(超过10M自动轮转)
pm2 set pm2-logrotate:max_size 10M

# 配置保留天数
pm2 set pm2-logrotate:retain 7

# 配置轮转时间(每天凌晨轮转)
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD

在华为云服务器上,建议将日志目录设置在独立的数据盘上,避免日志增长导致系统盘空间不足。

内存泄漏防护与监控

Node.js应用的内存泄漏是生产环境的常见问题,PM2提供了有效的防护机制:

1. 配置内存阈值自动重启

在ecosystem.config.js中设置max_memory_restart,当进程内存超过阈值时PM2会自动重启该进程,避免内存持续增长导致服务器崩溃。

2. 启用V8内存限制

通过node_args: '--max-old-space-size=512'限制Node.js堆内存上限,与PM2的内存重启机制配合使用。

3. 实时监控内存使用

# 打开PM2监控面板,实时查看CPU和内存
pm2 monit

# 查看特定应用的详细信息
pm2 show my-node-app

4. 定期检查进程重启次数

# 查看重启次数,异常频繁重启说明存在问题
pm2 show my-node-app | grep "restart time"

集群模式性能优化

华为云弹性云服务器提供多核CPU配置,通过PM2集群模式可以充分利用所有核心:

选择合适的实例数量:

  • 1-2核服务器:建议设置instances: 2,预留部分资源给系统和Nginx
  • 4核及以上服务器:可以使用instances: 'max',充分利用所有核心
  • 有状态应用(如WebSocket):建议使用fork模式单实例运行,配合Redis实现状态共享

集群模式下的注意事项:

  • Next.js等SSR框架内部有自己的多线程处理,建议使用instances: 1的fork模式
  • NestJS等纯API服务适合cluster模式,可以显著提升并发处理能力
  • 构建阶段内存消耗较大,建议在构建时临时停止PM2管理的进程

配合Nginx实现生产级部署

PM2应与Nginx反向代理配合使用,形成完整的生产部署架构:

upstream node_backend {
    server 127.0.0.1:3000 max_fails=2 fail_timeout=30s;
    keepalive 64;  # 保持长连接,减少TCP握手开销
}

server {
    listen 80;
    server_name 你的域名;

    # 静态资源由Nginx直接处理
    location /_next/static/ {
        alias /var/www/app/.next/static/;
        expires 365d;
        add_header Cache-Control "public, immutable";
    }

    # 动态请求转发给PM2管理的Node.js进程
    location / {
        proxy_pass http://node_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

这种架构让Nginx处理SSL终止、静态文件服务和请求缓冲,PM2专注于Node.js进程管理,各司其职提升整体稳定性。

常见问题与解决方案

Q:服务器重启后应用没有自动恢复怎么办?

A:检查是否执行了pm2 startup输出的sudo命令,以及是否执行了pm2 save。可以通过pm2 resurrect手动恢复之前保存的进程列表。

Q:PM2应用频繁重启是什么原因?

A:查看错误日志pm2 logs 应用名 --err,常见原因包括内存泄漏、端口占用、依赖缺失或配置错误。可以通过max_restarts限制最大重启次数防止无限重启。

Q:如何在不中断服务的情况下更新代码?

A:使用pm2 reload而非pm2 restart。reload在集群模式下逐个重启worker,确保任何时刻都有worker在处理请求。更新代码后执行npm install && pm2 reload ecosystem.config.js即可。

Q:华为云服务器1核2G配置够用吗?

A:个人项目和轻量API服务基本够用,但SSR应用对内存消耗较大,建议选择2核4G配置。同时要合理设置max_memory_restart参数,避免内存耗尽导致服务不可用。