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

PM2 cluster模式下Node应用每个集群实例占用独立端口问题排查求助

核心根因

你当前的启动链路中间多了一层npm进程代理,导致PM2的cluster模式端口共享能力不生效:
PM2的cluster模式端口共享逻辑,要求PM2直接作为父进程管理实际监听端口的Node业务进程,此时PM2会在内核层面做端口的负载均衡分发,所有子进程复用同一个端口。
但你现在的配置是PM2启动npm进程作为子进程,npm进程再执行npm run build后fork出serve进程:

  • PM2管理的是npm进程,不是实际监听端口的serve进程
  • serve进程是npm的子进程,不归PM2集群调度模块控制,第二个serve进程启动时发现5000端口被第一个占用,就会自动监听随机空闲端口,就出现了你看到的两个进程端口不同的情况。
    这也符合你测试简单HelloWorld应用时端口共享正常的表现,因为测试用例中PM2直接管理监听端口的业务进程,没有中间层代理。
其他可能导致端口不共享的排查方向
  • 检查应用监听端口的逻辑是否硬编码了端口递增逻辑:部分应用会在启动时判断端口被占用就自动+1监听,即使PM2做了端口复用配置,应用自身逻辑优先的话也会出现多端口
  • 检查是否混用了fork模式和cluster模式:如果配置中exec_mode配置错误或者被其他地方覆盖,fork模式下每个进程都是独立的,天然不会共享端口
  • 检查Node版本兼容性:部分旧版Node的cluster模块存在端口复用的bug,可升级到LTS版本验证
针对你当前场景的修复方案
  1. 把构建步骤和启动步骤拆分,不需要每次启动实例都做构建,构建只需要在部署时执行一次即可
  2. 修改PM2配置,直接启动serve命令,不要通过npm中转,修改后的ecosystem.config.js参考:
module.exports = {
    apps : [{
        name: "Application",
        script: "npx",
        args: "serve -s dist",
        exec_mode: "cluster",
        instances : 2,
        wait_ready: true,
        listen_timeout: 30000
    }]
}
  1. 部署流程调整为:先执行npm run build完成产物构建,再执行pm2 start ecosystem.config.js启动服务即可。

内容的提问来源于stack exchange,提问作者Ian MacLean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:57:01