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

如何用PM2实现API后端负载均衡并解决端口冲突问题?

解决PM2集群模式端口冲突的负载均衡方案

方案一:利用PM2原生集群模式的端口共享(无需额外反向代理)

问题根源是你的代码硬编码监听3000端口,且未适配PM2集群模式的端口共享机制,按以下步骤调整:

  1. 修改Express代码:
    将监听地址改为0.0.0.0(允许跨网卡访问,适配PM2集群端口共享逻辑),同时支持从环境变量读取端口提升灵活性:

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      res.send('Hello, World!');
    });
    
    // 优先读取环境变量端口,默认3000,监听所有网卡地址
    const port = process.env.PORT || 3000;
    app.listen(port, '0.0.0.0', () => {
      console.log(`API instance ${process.pid} listening on port ${port}`);
    });
    
  2. 重新启动PM2集群:
    执行原启动命令即可,此时PM2会通过Node.js的cluster模块实现端口共享,操作系统自动将请求分发给两个实例:

    pm2 npm start --name apis -i 2 -- start
    

    再次执行pm2 ls就能看到两个实例正常运行,无端口冲突报错。

方案二:多端口实例 + Nginx反向代理(适合需独立端口管理的场景)

如果需要每个实例监听不同端口,再通过反向代理实现负载均衡,按以下步骤操作:

  1. 调整Express代码:
    确保代码从环境变量读取端口,让每个实例可使用不同端口:

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      res.send('Hello, World!');
    });
    
    const port = process.env.PORT || 3000;
    app.listen(port, '0.0.0.0', () => {
      console.log(`API instance listening on port ${port}`);
    });
    
  2. 创建PM2配置文件:
    在项目根目录新建ecosystem.config.js,定义两个实例的端口参数:

    module.exports = {
      apps: [
        {
          name: 'api-instance-1',
          script: 'npm',
          args: 'start',
          env: {
            PORT: 3000
          }
        },
        {
          name: 'api-instance-2',
          script: 'npm',
          args: 'start',
          env: {
            PORT: 3001
          }
        }
      ]
    };
    
  3. 启动PM2实例:

    pm2 start ecosystem.config.js
    
  4. 配置Nginx反向代理:
    修改Nginx配置文件(如/etc/nginx/nginx.conf或站点专属配置),添加负载均衡规则:

    http {
      # 定义上游服务器集群
      upstream api_cluster {
        server localhost:3000;
        server localhost:3001;
        # 可选:配置权重、故障转移规则,比如给某实例分配更多请求
        # server localhost:3000 weight=2;
      }
    
      server {
        listen 80; # 对外暴露的访问端口
    
        location / {
          proxy_pass http://api_cluster;
          # 传递请求头信息,避免后端获取不到真实请求地址
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
      }
    }
    

    重启Nginx使配置生效:

    sudo nginx -s reload
    

    此时用户访问服务器80端口,Nginx会自动将请求转发到3000、3001的实例,实现负载均衡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:40:35