Nginx实现多后端负载分担本质是通过upstream定义服务器组并由proxy_pass转发,需将upstream置于http块顶层,配合weight、backup、down、max_fails/fail_timeout等参数精准控制流量分配与健康状态,并选用轮询/ip_hash/least_conn等算法,透传X-Real-IP等关键请求头,最后通过日志和响应头验证分发效果。

用 Nginx 实现多后端负载分担,本质是通过 upstream 定义服务器组,再由 proxy_pass 将请求转发过去。关键不在“能不能”,而在“怎么配才稳、才准、才可验证”。
定义 upstream 服务器组
必须放在 http{} 块顶层,不能嵌套在 server{} 里,否则会报 unknown directive "upstream" 错误。
- 基础写法:
server 192.168.1.10:8080;,默认轮询,每台均等接收请求 - 加权重适配性能差异:
server 192.168.1.10:8080 weight=3;,weight=2;,weight=1;对应约 50% / 33% / 17% 流量比例 - 标记备用机:
server 192.168.1.11:8080 backup;,仅当其他全部不可用时启用 - 临时下线:
server 192.168.1.12:8080 down;,维护时平滑摘流,不参与调度 - 健康兜底:
max_fails=2 fail_timeout=30s;,连续失败 2 次后,30 秒内不再发请求
选对调度算法
算法决定流量怎么分,选错会导致负载不均或会话中断:
- 轮询(默认):适合无状态、配置相近的服务,请求依次打到各节点
- ip_hash:同一客户端 IP 固定落到同一台后端,适用于依赖本地 session 的老系统
- least_conn:新请求发给当前活跃连接最少的服务器,适合长连接类业务(如 WebSocket)
- hash $request_uri:按请求路径哈希,保障相同路径总打到同一台,利于缓存一致性或回源控制
反向代理配置要传真实信息
只写 proxy_pass 不够,后端常需识别用户来源和原始请求上下文:
-
proxy_set_header Host $host;:保留原始 Host,避免后端生成错误跳转链接 -
proxy_set_header X-Real-IP $remote_addr;:让后端拿到真实客户端 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:支持多层代理下的 IP 追溯 -
proxy_connect_timeout 15s;、proxy_read_timeout 60s;:防止单个慢响应拖垮整个 Nginx
验证分担效果是否生效
压测不是目的,确认流量真被分出去才是关键:
- 启动两个带标识的后端服务(如返回
X-Backend: server-a和X-Backend: server-b) - 在 Nginx 配置中开启 access_log,使用
$upstream_addr记录实际转发目标 - 用
wrk -t4 -c100 -d10s http://your-nginx-ip:8080/发起并发请求 - 检查响应头中的
X-Backend或日志里的upstream_addr字段分布是否符合预期比例


















