Nginx为Node.js做负载均衡需三步:启动多实例(如PORT=3000/3001/3002)、定义upstream服务组(含健康检查与keepalive)、配置反向代理(透传X-Real-IP等关键header)。

用 Nginx 给 Node.js(比如 Express)做负载均衡,核心就三步:启动多个后端实例、定义 upstream 服务组、配置反向代理规则。关键不在复杂度,而在细节是否对齐——比如 header 透传、连接复用、健康感知这些点漏掉,容易导致日志失真、会话异常或故障不自愈。
启动多个 Express 实例
Node.js 单进程天然受限,必须靠多实例分担压力。推荐用环境变量控制端口,避免硬编码:
- 终端 1:
PORT=3000 npm start - 终端 2:
PORT=3001 npm start - 终端 3:
PORT=3002 npm start
确保每个实例能独立响应(如访问 http://localhost:3000/health 返回 200),且应用内部不依赖本地内存存储会话——状态要外置到 Redis 或数据库。
定义 upstream 服务池
在 /etc/nginx/conf.d/express-lb.conf 中写 upstream 块,这是流量分发的“路由表”:
upstream express_servers {
server 127.0.0.1:3000 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3001 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3002 max_fails=3 fail_timeout=30s;
keepalive 64;
}
max_fails 和 fail_timeout 启用基础健康检查:连续 3 次失败(如超时或 5xx)后,Nginx 会暂时剔除该节点 30 秒;keepalive 复用后端连接,减少 TCP 握手开销。
配置反向代理与请求头透传
server 块里把流量打过去,同时必须透传真实客户端信息,否则 Express 日志和鉴权会出错:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://express_servers;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection '';
}
}
注意 Connection '' 是为了兼容 HTTP/1.1 的 Keep-Alive;X-Forwarded-For 累加式传递 IP,防止伪造;若用 HTTPS,还需在 proxy_set_header 中补上 X-Forwarded-SSL on。
按需选择分发策略
Nginx 默认轮询,但不同场景可换算法:
- 服务器性能差异大 → 用 weight:例如
server 127.0.0.1:3000 weight=5; - 需保持用户会话粘性(如未用 Redis 存 session)→ 用 ip_hash:加一行
ip_hash;在 upstream 内 - 长连接多、响应时间波动大 → 用 least_conn:优先派给当前活跃连接最少的实例
策略选错不会立刻报错,但上线后可能发现某台机器 CPU 持续 90%,另一台空闲——建议先用轮询跑通,再根据监控数据调整。


















