Nginx通过upstream块中server指令的weight=正整数实现平滑加权轮询,权重为相对值非百分比,自动归一化计算分流比;必须定义在http{}内、配合健康检查才生效,proxy_pass须引用upstream名称而非IP。

Nginx 通过 upstream 块中的 weight 参数实现基于权重的流量分配,本质是平滑加权轮询(Weighted Round Robin),不是简单按次数循环,而是依据相对权重长期趋近设定比例。
权重配置必须写在 http 块内的 upstream 中,且需配合健康检查机制,否则无法稳定生效。
权重怎么起作用?
- weight 是相对值,不是百分比。Nginx 自动归一化计算:比如 `weight=5`、`weight=3`、`weight=2`,总和为 10,对应实际分流比就是 50% : 30% : 20% - 未写 weight 的 server 默认为 1 - weight=0 表示临时下线,不参与调度,也不触发健康检查怎么写才有效?
- upstream 必须定义在 `http{}` 块内,不能放在 `server{}` 或 `location{}` 里 - proxy_pass 引用时必须用 `http://upstream_name` 格式,不能写成具体 IP+端口,否则权重失效 - 示例:upstream api_backend {
server 10.0.1.10:8000 weight=4;
server 10.0.1.11:8000 weight=1;
server 10.0.1.12:8000 weight=1;
}
→ 三台机器理论占比为 66.7% : 16.7% : 16.7%
为什么权重有时“不准”?
- 权重只在后端健康时生效;一旦某节点因 `max_fails` 被标记为不可用,它的 weight 就暂停,剩余节点按新权重比例重新分担全部流量 - 短连接、低并发下统计偏差大,建议在持续中高流量下验证(如 1000+ 请求采样) - 不能和 `ip_hash` 同时使用——冲突,weight 会被忽略怎么让权重更可靠?
- 搭配 `max_fails=3 fail_timeout=30s`,自动剔除异常节点 - 用 `down` 手动下线维护中的服务器 - 用 `backup` 标记灾备节点,仅当其他全不可用时启用 - 权重设定应有依据:比如按 CPU 核心数(8 核 → weight=8)、内存容量(32GB → weight=16),或灰度发布需求(新版本 weight=1,老版本 weight=9)不复杂但容易忽略。


















