如何用PM2实现API后端负载均衡并解决端口冲突问题?
解决PM2集群模式端口冲突的负载均衡方案
方案一:利用PM2原生集群模式的端口共享(无需额外反向代理)
问题根源是你的代码硬编码监听3000端口,且未适配PM2集群模式的端口共享机制,按以下步骤调整:
修改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}`); });重新启动PM2集群:
执行原启动命令即可,此时PM2会通过Node.js的cluster模块实现端口共享,操作系统自动将请求分发给两个实例:pm2 npm start --name apis -i 2 -- start再次执行
pm2 ls就能看到两个实例正常运行,无端口冲突报错。
方案二:多端口实例 + Nginx反向代理(适合需独立端口管理的场景)
如果需要每个实例监听不同端口,再通过反向代理实现负载均衡,按以下步骤操作:
调整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}`); });创建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 } } ] };启动PM2实例:
pm2 start ecosystem.config.js配置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
相关产品推荐
相关产品推荐

