You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next 14项目PM2集群模式下多进程无限重启问题求助

Next.js 14 + PM2 Cluster模式进程无限重启问题解决

问题详情

  • 环境:Next.js 14项目,PM2 5.3.1,4核vCPU、6GB内存VPS
  • 现象:以cluster模式启动后仅1个进程稳定运行,其余3个进程陷入无限重启循环(已重启24次)
  • 已尝试:配置max_memory_restart参数,无效果
  • 当前ecosystem.config.js配置:
module.exports = {
  apps: [
    {
      name: "application",
      script: "npm",
      exec_mode: "cluster",
      instances: "max",
      args: "start",
      env: {
        NODE_ENV: "production",
        PORT: 5000
      },
    },
  ],
};
  • PM2关键日志片段:
PM2      | App [application:3] online
0|application  | > ecommerce-admin@0.1.0 start
0|application  | > next start
PM2            | App name:application id:1 disconnected
PM2            | App [application:1] exited with code [1] via signal [SIGINT]
PM2            | App [application:1] starting in -cluster mode-
...(进程重启循环日志重复)

问题根源

所有cluster子进程被强制配置为监听同一个端口5000,引发端口冲突:第一个进程成功绑定端口后,后续进程启动时因端口被占用直接退出,触发PM2的自动重启机制,形成无限循环。max_memory_restart无效是因为问题并非内存溢出,而是启动阶段的端口占用错误。

解决方案

方案1:让PM2自动管理端口(推荐)

移除配置中手动指定的PORT,PM2在cluster模式下会自动为每个子进程分配独立端口,并通过主进程完成负载均衡转发请求:

module.exports = {
  apps: [
    {
      name: "application",
      script: "npm",
      exec_mode: "cluster",
      instances: "max",
      args: "start",
      env: {
        NODE_ENV: "production"
      },
      // 可选:调整超时参数适配Next.js启动速度
      listen_timeout: 10000,
      kill_timeout: 5000
    },
  ],
};

方案2:手动分配端口+反向代理(适合自定义端口场景)

改用fork模式,为每个进程分配不同端口,再通过Nginx等反向代理工具实现负载均衡:

module.exports = {
  apps: [
    {
      name: "application-1",
      script: "npm",
      exec_mode: "fork",
      args: "start",
      env: {
        NODE_ENV: "production",
        PORT: 5000
      },
    },
    {
      name: "application-2",
      script: "npm",
      exec_mode: "fork",
      args: "start",
      env: {
        NODE_ENV: "production",
        PORT: 5001
      },
    },
    {
      name: "application-3",
      script: "npm",
      exec_mode: "fork",
      args: "start",
      env: {
        NODE_ENV: "production",
        PORT: 5002
      },
    },
    {
      name: "application-4",
      script: "npm",
      exec_mode: "fork",
      args: "start",
      env: {
        NODE_ENV: "production",
        PORT: 5003
      },
    },
  ],
};

Nginx反向代理示例配置(需自行调整域名等信息):

server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        
        # 轮询转发至其他节点
        proxy_pass http://localhost:5001;
        proxy_pass http://localhost:5002;
        proxy_pass http://localhost:5003;
    }
}

验证步骤

  1. 停止现有进程:pm2 delete application
  2. 加载新配置启动:pm2 start ecosystem.config.js
  3. 查看进程状态:pm2 status
  4. 检查日志确认无报错:pm2 logs application

内容的提问来源于stack exchange,提问作者Rafael Junio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:44:57