加权轮询是nginx明确支持的独立策略,非“轮询权重”混合概念;需结合max_fails/fail_timeout健康感知、keepalive连接复用及proxy_next_upstream重试机制,才能使权重真正按算力差异生效。

Nginx 本身不支持“轮询权重”这种混合命名的策略——轮询(round robin)和加权轮询(weighted round robin)是两种明确区分的模式,不能同时启用。所谓“轮询权重”容易引起误解:
- 如果你希望按服务器算力差异分配请求比例,用的是加权轮询;
- 如果你追求长期统计下各节点请求数绝对均等,那必须用纯轮询(所有 weight=1 或不写 weight),且排除干扰项。
真正的“算力完美均摊”并缩短平均响应时间,靠的不是改名字,而是组合配置:加权 + 健康感知 + 连接复用 + 超时控制。下面分三块说清楚:
一、用加权轮询匹配真实算力差异
权重不是拍脑袋定的,应基于后端实际能力折算。例如:
- 一台 8 核 CPU + 32GB 内存的服务器,处理能力约是 4 核 + 16GB 服务器的 1.8~2 倍 → 可设 weight=2
- 若某台启用了 SSD 缓存且压测响应时间比其他快 40%,可酌情加权至 weight=1.5
- 新上线服务器建议从 weight=1 开始,观察 1 小时 CPU/延迟指标后再逐步上调
配置示例(/etc/nginx/conf.d/balance.conf):
upstream api_backend {
server 192.168.1.10:8000 weight=3 max_fails=2 fail_timeout=20s;
server 192.168.1.11:8000 weight=2 max_fails=2 fail_timeout=20s;
server 192.168.1.12:8000 weight=1 max_fails=2 fail_timeout=20s;
}
二、让权重真正生效的关键增强项
只写 weight 不够,Nginx 默认不检查后端是否真能响应。以下三项必须补上:
- 健康状态感知:max_fails + fail_timeout 让故障节点自动退出调度队列,避免把请求打到卡死的服务上
-
连接复用:在 upstream 块中加
keepalive 32;,并在 location 中配proxy_http_version 1.1;和proxy_set_header Connection '';,减少 TCP 握手开销 -
超时与重试:在 location 块里设置
proxy_connect_timeout 3s;、proxy_read_timeout 10s;、proxy_next_upstream error timeout http_500;,失败时自动换节点重试
三、安全后端适配要点
若后端启用了 HTTPS、认证或 IP 白名单,反向代理需同步适配:
- 后端是 HTTPS?把
proxy_pass https://api_backend;,并加proxy_ssl_verify off;(生产环境建议配真实证书校验) - 需要透传客户端真实身份?确保
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For $proxy_add_x_forwarded_for;已启用 - 后端做了源 IP 白名单?Nginx 需开启
set_real_ip_from并用real_ip_header X-Forwarded-For;解析真实来源
最后别忘了验证:sudo nginx -t && sudo systemctl reload nginx,再用 curl 或 ab 工具发 1000+ 请求,对比各后端 access.log 行数与平均响应时间是否符合权重预期。











