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; } }
验证步骤
- 停止现有进程:
pm2 delete application - 加载新配置启动:
pm2 start ecosystem.config.js - 查看进程状态:
pm2 status - 检查日志确认无报错:
pm2 logs application
内容的提问来源于stack exchange,提问作者Rafael Junio
相关产品推荐
相关产品推荐

