用pm2启动多个node.js实例并监听不同本地端口,再通过nginx upstream轮询代理实现负载均衡。关键在于pm2独立管理各进程,nginx统一转发请求,且node只绑定127.0.0.1确保安全。

用 PM2 启动多个 Node.js 实例,再通过 Nginx 的 upstream 做反向代理分发,就能实现真正的多实例负载均衡。关键不是“Nginx 管多实例”,而是“PM2 管多个独立进程 + Nginx 统一分流”。
启动多个 Node 实例(用 PM2 统一管理)
同一份代码,监听不同端口,由 PM2 分别守护:
- 先确保已全局安装:
npm install -g pm2 - 进入项目目录,依次启动多个实例(端口不重复):
pm2 start app.js -i 1 --name "api-3001" --port 3001pm2 start app.js -i 1 --name "api-3002" --port 3002 - 推荐用
-i 1显式声明单实例模式,避免 PM2 自带集群与 Nginx 负载逻辑冲突 - 运行
pm2 list确认所有实例状态为 online
配置 Nginx upstream 实现轮询分发
在 /etc/nginx/conf.d/your-site.conf 或主配置中添加:
- 定义后端服务组(无需关心 PM2):
upstream node_backend {<br> server 127.0.0.1:3001;<br> server 127.0.0.1:3002;<br> # 可加 weight=2 或 backup 实现权重或容灾<br>} - 在
server块中代理请求:location / { proxy_pass http://node_backend; } - 务必保留关键 header:
proxy_set_header X-Real-IP $remote_addr;proxy_set_header Host $host;
确保 Node 应用绑定安全地址
每个实例必须只监听本地回环,防止端口被直接访问:
- 代码中监听写成:
app.listen(3001, '127.0.0.1'),不要用'0.0.0.0' - 检查是否生效:
netstat -tuln | grep :3001,应只显示127.0.0.1:3001 - Nginx 是唯一对外入口,Node 实例完全对公网不可见
日常维护与故障应对
多实例下运维需关注整体健康,而非单点:
- 查看全部日志:
pm2 logs --merge(合并输出) - 监控资源分布:
pm2 monit,观察各实例 CPU/内存是否均衡 - 单实例异常时,PM2 会自动重启它;Nginx 默认跳过宕机节点(默认健康检查)
- 手动重启某实例:
pm2 restart api-3001,不影响其他实例和流量











