Nginx加权轮询通过weight参数实现算力匹配,权重为正整数(1–1000),默认值为1,按相对比例分配请求,如weight=4:2:1对应16C:8C:4C服务器;需配合max_fails、fail_timeout、slow_start等策略提升稳定性,并通过日志和监控验证实际分流效果。

Nginx 默认的 round-robin 是不加权的,要让不同算力(比如 CPU、内存差异大)的后端服务器按比例分担请求,就得用 加权轮询(weighted round-robin),通过 weight 参数显式指定每台后端的权重。
配置 weight 实现算力匹配
权重值是相对值,不是百分比,也不需要归一化。比如一台 16 核服务器设为 weight=8,一台 4 核设为 weight=2,它们的请求比例就是 8:2 = 4:1。
- 权重越高,Nginx 在一轮调度中分配给它的请求次数越多
- 默认 weight=1,不写等价于
weight=1 - weight 必须是正整数(1–1000),不能是小数或 0
基础配置示例
假设你有三台后端,算力分别为高(16C)、中(8C)、低(4C),可按核数比例设为 4:2:1:
upstream backend_cluster {
server 192.168.1.10:8080 weight=4; # 高配
server 192.168.1.11:8080 weight=2; # 中配
server 192.168.1.12:8080 weight=1; # 低配
}
<p>server {
location / {
proxy_pass <a href="https://www.php.cn/link/26a9c7ab6107b61166fbbc7e64756a1f">https://www.php.cn/link/26a9c7ab6107b61166fbbc7e64756a1f</a>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}配合其他策略更稳当
仅靠 weight 不足以应对真实场景,建议组合使用:
- 加上
max_fails=3 fail_timeout=30s,自动剔除短时不可用节点 - 对关键服务加
slow_start=60s,新上线节点逐步加量,避免冷启动冲击 - 若后端响应时间差异大,可启用
least_conn作为兜底(但注意它和 weight 不冲突,Nginx 仍会按权重在健康节点间轮询)
验证与调优提示
权重生效后,可通过日志或监控观察各后端实际请求数比例是否接近预期:
- 开启 Nginx access_log 的
$upstream_addr变量,查看每次请求打到了哪台后端 - 用
nginx -t检查语法,reload 后用curl -I多次测试,观察X-Upstream(如自定义头)或后端日志分布 - 如果某台机器 CPU 已饱和但权重没调低,请求还在进来,说明需结合监控动态调权(此时建议上 OpenResty + Lua 或外部调度器)


















