Nginx权重配置本质是按后端真实服务能力分配流量,需基于CPU/内存、实测P95延迟、业务场景三维度设定合理整数比,严格写在upstream内server指令后,仅对round_robin和ip_hash生效,并必须搭配max_fails/fail_timeout健康检查才真正有效。

在 Nginx 集群中配置不同权重的节点,本质是让流量按后端真实服务能力分配,而不是平均切分。关键不在于“设多少”,而在于“为什么这么设”以及“怎么让它真正生效”。
权重设定要基于可量化的服务能力
拍脑袋定 weight=5 或 weight=10 容易失衡。推荐从三个维度综合判断:
- CPU 与内存资源:8 核 32GB 机器可设为 weight=8,4 核 16GB 设为 weight=4;避免用 1 和 100 这类悬殊值,小权重节点可能长时间收不到请求
-
实测响应性能:用
$upstream_response_time统计各节点 P95 延迟,若 A 节点延迟 120ms、B 为 360ms,可初步按倒数比设为 weight=3 和 weight=1 - 业务场景适配:灰度发布时新实例设 weight=1,老实例 weight=9;混合部署中,新服务器 weight=5、旧服务器 weight=2,防止旧机过载
配置写法必须规范,否则权重不生效
weight 是个“娇气参数”,位置错、类型错、上下文错都会失效:
- 只能写在
upstream块内的server指令后,如server 10.0.0.1:8080 weight=3; - 不能写成独立行、不能放
location或proxy_pass后面、不能是小数或负数 - 仅对默认的
round_robin和ip_hash生效;第三方模块(如fair)不识别该参数 - 默认值为 1;设为 0 表示不参与调度,但仍接受健康检查
光设权重不够,必须搭配健康检查与连接优化
没有健康感知的权重,就像给故障车分配更多高速路——只会放大问题:
- 加
max_fails=2 fail_timeout=15s:连续失败两次就临时剔除,等 15 秒再试,避免持续打到慢节点 - 启用
keepalive 32并配proxy_http_version 1.1+ 清空Connection头,复用连接,减少建连开销 - 开启重试:
proxy_next_upstream error timeout http_500,单点失败自动切下一节点 - 用
backup标记灾备节点,仅当全部主节点不可用时才启用
验证效果不能只看理论比例
weight=3 和 weight=1 的两台机器,在少量请求下可能连续打到同一台——这是加权轮询的正常行为。要确认是否达标,得看统计结果:
- 采集 1000+ 请求的日志,用
awk '{print $NF}' access.log | sort | uniq -c统计各后端 IP 出现频次 - 允许合理误差(±5%),但若实际占比严重偏离(如理论 75% 却只有 40%),需排查:后端是否偶发超时?SSL 握手是否失败?
X-Real-IP是否缺失导致后端拒绝? - 修改权重后执行
nginx -t && nginx -s reload,无需重启进程,但必须 reload 才生效


















