nginx为node.js配置负载均衡核心三步:启动多个node实例(推荐pm2管理)、定义upstream分组(支持轮询/权重/ip_hash/健康检查)、配置反向代理并透传真实ip、http/1.1长连接及websocket升级头。

用 Nginx 给 Node.js 配负载均衡,核心就三步:启动多个 Node 实例、定义 upstream 分组、配置反向代理规则。关键不在复杂,而在细节是否到位——比如真实 IP 透传、连接复用、健康感知,这些漏掉一个,高可用就打折扣。
启动多个 Node.js 实例
不能只跑一个进程。Node.js 单实例天然受限于单线程和 CPU 核心数,必须横向扩展:
- 用环境变量指定端口,例如
PORT=3000 npm start、PORT=3001 npm start - 推荐用 PM2 管理多实例,避免手动维护:
pm2 start app.js -i 4 --name "node-api"(自动分配 4 个进程,各监听不同端口) 或更明确地控制端口:pm2 start app.js --name "api-3000" -- PORT=3000 - 确保所有实例共用同一套代码和配置,尤其数据库连接、Redis 会话存储等共享资源要统一
配置 upstream 分组
在 /etc/nginx/conf.d/your-app.conf 里定义后端服务池,这是负载均衡的“大脑”:
- 基础轮询(默认):
upstream node_backend {<br> server 127.0.0.1:3000;<br> server 127.0.0.1:3001;<br> server 127.0.0.1:3002;<br>} - 加权分发(适配异构机器):
server 127.0.0.1:3000 weight=3;(性能强的机器承接更多流量) - 带健康检查(生产必备):
server 127.0.0.1:3000 max_fails=3 fail_timeout=30s;(连续失败 3 次,30 秒内不转发请求) - 会话保持(如需登录态黏着):
ip_hash;放在 upstream 块开头,让同一 IP 总打到同一实例
设置反向代理与请求头透传
server 块里把流量导过去,但光 proxy_pass 不够,客户端信息必须完整传递给 Node:
- 必须设置这几行,否则 Express 中
req.ip变成127.0.0.1,日志和限流全乱:proxy_set_header X-Real-IP $remote_addr;<br>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br>proxy_set_header X-Forwarded-Proto $scheme;<br>proxy_set_header Host $host;
- 启用 HTTP/1.1 长连接提升效率:
proxy_http_version 1.1;<br>proxy_set_header Connection "";
- 若应用含 WebSocket 或 SSE,补上升级头:
proxy_set_header Upgrade $http_upgrade;<br>proxy_set_header Connection "upgrade";
验证与日常维护
配完别急着上线,先确认实际效果:
- 重载配置:
sudo nginx -t && sudo systemctl reload nginx - 查日志看分发是否均匀:
tail -f /var/log/nginx/access.log,观察不同端口是否都有访问记录 - 手动停掉一个实例(如
kill -9 $(lsof -t -i :3001)),观察 Nginx 是否自动跳过它,且其他实例继续响应 - 用
curl -H "Host: your-domain.com" http://localhost/health测试路由通路











