加权轮询是Nginx针对服务器性能差异设计的负载策略,按weight值比例分配请求,如weight=3、2、1对应长期请求比≈3:2:1,采用平滑加权算法避免流量突增,需在upstream中配置整数权重并配合max_fails等健康检查参数使用。

加权轮询是 Nginx 负载均衡中兼顾公平性与资源差异性的实用策略,特别适合后端服务器性能不一致的场景。它不是简单地“轮流点名”,而是按权重比例分配请求,让高配机器多干活、低配机器少分担,从而提升整体吞吐和稳定性。
加权轮询的核心逻辑
权重(weight)决定每台服务器在一轮调度中被选中的次数比例。Nginx 不是按“百分比”实时计算,而是维护一个内部计数器,按 weight 值累加调度序列。例如:
- server A weight=3
- server B weight=2
- server C weight=1
实际请求分配顺序近似为:A → A → A → B → B → C →(循环)。注意这不是严格固定六次一循环,而是长期统计趋近该比例(3:2:1),Nginx 内部采用平滑加权轮询(Smooth Weighted Round Robin)算法,避免突发集中打到同一台机器。
配置加权轮询的关键写法
权重必须定义在 upstream 块内的 server 指令后,且仅对当前 upstream 生效。默认 weight=1,不写即视为 1。
示例配置:
http {
upstream app_backend {
server 192.168.1.10:8080 weight=4; # 四核服务器
server 192.168.1.11:8080 weight=2; # 两核服务器
server 192.168.1.12:8080 weight=1; # 旧设备,仅作备用
}
<pre class="brush:php;toolbar:false;">server {
listen 80;
location / {
proxy_pass http://app_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}}
⚠️ 注意:weight 只支持整数,不支持小数或百分比(如 weight=0.5 或 weight=50% 是非法的);权重值过大(如超过 1000)可能影响调度精度,建议控制在 1–100 范围内。
配合健康检查提升可靠性
加权轮询本身不感知后端是否宕机。必须搭配故障自动剔除机制,否则权重再高也转不到不可用节点。推荐为每个 server 显式添加容错参数:
- max_fails=3:连续失败 3 次即标记为不可用
- fail_timeout=30s:30 秒内不向该节点转发请求
- slow_start=60s(可选):恢复后缓慢增加流量,避免刚上线就压垮
完整写法示例:
server 192.168.1.10:8080 weight=4 max_fails=3 fail_timeout=30s slow_start=60s;
验证加权效果的实操方法
不能只靠肉眼刷新网页判断。推荐两种可靠方式:
-
日志分析法:在各后端服务 access log 中记录来源 IP 或添加唯一标识头(如
X-Upstream-Server: node1),用脚本统计 1000+ 请求中各节点命中次数,看是否接近权重比(如 4:2:1 ≈ 57% : 29% : 14%) -
ab 或 wrk 压测:使用
ab -n 1200 -c 100 http://nginx-ip/发起 1200 次请求,再查各后端访问日志行数
若发现偏差较大,需检查:是否启用了 ip_hash 冲突、是否有缓存代理干扰真实 IP、后端是否返回了 5xx 导致 Nginx 重试并计入新调度等。











