权重配置需基于实测qps设静态值(如1200:800→3:2),延迟超2倍则权重减半,最大比≤3:1;配合健康检查实现软降权与慢启动;通过openresty/lua或consul动态调权;并启用keepalive与合理缓冲区避免连接效率拖累。

权重参数本身不提升物理吞吐上限,但能让现有后端资源被更合理地利用——关键不是“调高”,而是“配准”:让强节点多承接、弱节点少分担,避免空转与过载并存。
按实测能力设静态权重
别凭CPU型号或内存大小拍脑袋,要基于真实处理能力定值:
- 用 wrk 或 ab 对每台后端单独压测相同接口(如 1000 QPS 持续 2 分钟),记录稳定 QPS 和 P95 延迟
- 按 QPS 比例设 weight,例如 A 能扛 1200 QPS、B 能扛 800 QPS → weight 设为 3 和 2
- 若某节点延迟是其他节点的 2 倍以上,权重可设为一半;最大权重比建议控制在 3:1 以内,防止小权重节点长期闲置
- weight 是相对整数,weight=4 3 2 和 weight=8 6 4 效果一致,Nginx 自动归一化计算比例
用健康检查实现自动降权
静态权重会随运行状态失效,需靠健康检查形成“软降权”机制:
- 配置 max_fails=2 fail_timeout=30s:某节点连续失败 2 次,30 秒内不再分发请求,等效临时权重归零
- 搭配 slow_start=30s(Nginx 1.11.5+):新节点上线后权重从 0 缓慢升至设定值,防冷启动雪崩
- 启用主动探测 health_check interval=5 fails=3 passes=2,路径返回 200 才视为可用,配合 max_fails 更精准识别劣化节点
接入实时指标做动态调权
人工调权滞后于问题发生,必须让权重随响应延迟、错误率等指标自动变化:
- OpenResty + Lua 方案:每 3 秒采集各节点 P95 延迟,用公式 weight = base × (100 / actual_p95)^1.5 实时重算,通过 balancer.set_current_peer() 内存更新,毫秒级生效
- nginx-upsync-module + Consul:sidecar 定期上报 CPU 和延迟,写入 Consul KV 的 weight 字段,Nginx 每 300ms 拉取生效,天然支持 fallback 权重
- nginx-upstream-dynamic-servers + HTTP API:脚本从 Prometheus 拉取指标,算出权重后 POST 到 /upstream/servers 接口,轻量易集成
别让连接效率拖垮权重效果
权重再准,如果连接反复新建或卡在缓冲环节,吞吐照样上不去:
- upstream 块中必须加 keepalive 32;,location 中配 proxy_http_version 1.1 和 proxy_set_header Connection ''
- proxy_buffers 设为 16 512k(共 8MB),proxy_busy_buffers_size 设为 256k~512k,避免因缓冲区满而阻塞上游读取
- 关闭 proxy_buffering off(除非明确需要流式响应),否则会破坏事件循环,导致超时堆积
- 检查后端连接池是否足够容纳复用连接,例如 Spring Boot 默认 max-connections=8192,需确认未达瓶颈











