Nginx可作为成熟轻量的负载均衡器,关键在于合理配置upstream健康检查(max_fails/fail_timeout)、角色区分(backup/down)、算法选型(weight/ip_hash/least_conn)、真实头透传(Host/X-Real-IP/X-Forwarded-Proto)、超时匹配后端P99、连接复用及重试机制。

直接用 Nginx 做后端服务的负载均衡器(LB)是成熟、轻量且高可用的方案,无需额外引入中间 LB 设备。关键不在“对接”,而在于如何让 Nginx 本身成为可靠、可运维、具备健康感知的 LB 层。
upstream 定义要兼顾容错与调度
后端服务节点的声明必须包含基础健康控制参数,不能只写 IP+端口。否则单点故障会拖慢整体响应甚至导致请求堆积。
-
每台 server 显式配置 max_fails 和 fail_timeout:例如
server 192.168.1.10:8080 max_fails=2 fail_timeout=15s;,表示连续失败 2 次后,15 秒内不再分发请求 -
区分角色:backup 和 down 要合理使用:临时下线用
down;灾备节点用backup,仅当所有非 backup 节点不可用时才启用 - 避免裸写 ip_hash 除非真有会话粘性需求:它会破坏负载分散性,且客户端 IP 变化(如 NAT 环境)会导致会话漂移
proxy_pass 转发需透传真实上下文
Nginx 作为 LB 层,必须把原始请求特征准确传递给后端,否则日志、鉴权、限流等逻辑可能失效。
-
Host 头必须重写为后端真实 Host:用
proxy_set_header Host $host;或更稳妥的proxy_set_header Host $http_host; -
客户端真实 IP 必须透传:至少设置
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;,方便后端判断是 http 还是 https
超时与连接管理必须匹配后端能力
默认超时值(60s)往往远高于后端实际处理能力,容易造成连接堆积、线程阻塞,尤其在高并发或后端偶发延迟时。
-
connect/read/send 超时建议设为后端 P99 响应时间的 1.5~2 倍:比如后端平均耗时 300ms,P99 是 1.2s,可设
proxy_connect_timeout 3s; proxy_read_timeout 3s; proxy_send_timeout 3s; -
开启 upstream keepalive 并配好连接池:在 upstream 块外加
keepalive 32;,再在 location 中用proxy_http_version 1.1;+proxy_set_header Connection '';复用连接 -
启用自动重试机制:加上
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;,允许失败时换节点重试(注意幂等性)
策略选型要看业务特性而非默认轮询
轮询看似简单,但对异构集群或状态敏感服务并不适用。选错算法等于埋下稳定性隐患。
-
后端性能差异大 → 用 weight:例如新机器配置高,设
weight=3;老机器设weight=1,流量按比例分配 - 后端有本地缓存或 session 存储 → 用 ip_hash 或 hash $request_uri:保证同一资源/用户始终落到同一节点
- 长连接或慢查询多 → 用 least_conn:优先把新请求分给当前活跃连接最少的后端,防止单节点过载


















