Nginx通过upstream块中server指令的weight参数实现加权轮询,权重为正整数、表示相对服务能力,需置于http{}内独立upstream定义中,配合max_fails和fail_timeout等健康检查参数才具备容错能力。

直接在 upstream 块里给每个后端服务器设 weight 参数,Nginx 就会按比例分发请求。这不是简单轮着来,而是加权轮询(Weighted Round Robin),长期来看流量分布会贴近你设定的权重比。
权重怎么写才有效
必须把 upstream 定义在 http 块内,不能放在 server 或 location 里。每个 server 行后面紧跟 weight=数值,默认是 1:
-
server 192.168.1.101 weight=5;→ 理论占比约 50%(若总权重为 10) -
server 192.168.1.102 weight=3;→ 占比约 30% -
server 192.168.1.103 weight=2;→ 占比约 20%
权重不用归一化,Nginx 自动算比例;建议用整数,避免悬殊过大(比如 1 和 100),否则小权重机器可能长时间收不到请求。
光设权重不够稳,得配健康检查
后端挂了,Nginx 不会自动跳过,必须加上故障探测机制:
-
max_fails=3:连续失败 3 次,就标记该节点为不可用 -
fail_timeout=30s:接下来 30 秒内不往它发请求 -
down:手动下线维护中的节点(如server 192.168.1.104 down;) -
backup:只在其他节点全不可用时启用(如灾备机)
权重值怎么定才合理
别拍脑袋,要结合实际能力量化:
- CPU 核心数:8 核机器设
weight=8,4 核设weight=4 - 内存容量:32GB 服务器可设为 16,16GB 设为 8(按 GB/2 取整)
- 灰度发布:新版本实例设
weight=1,老版本设weight=9,实现 10% 流量切入 - 混合部署:新服务器
weight=5,旧服务器weight=2,防止旧机过载
改完怎么验证和生效
配置保存后,执行 nginx -t 检查语法,再运行 nginx -s reload 重载,无需重启进程。
验证是否按预期分配:
- 用
curl -I或查 access log,统计各后端 IP 的访问次数(建议采样 1000+ 请求) - 观察实际占比偏差,正常应控制在 ±3% 以内
- 注意:Nginx 社区版不支持运行时动态改权重,改了就得 reload


















