Nginx内置加权轮询通过upstream中weight参数实现,按权重比例动态调度请求,支持容错降权与least_conn协同优化长连接分配,需nginx -t校验后reload生效。

直接在 upstream 块中为每个后端服务器设置 weight 参数,Nginx 就会按权重比例分发请求。这不是插件或高级功能,而是内置机制,从 1.0.0 版本起就稳定支持,Windows 和 Linux 下行为一致。
加权轮询的核心配置写法
权重值代表相对处理能力,数值越大,被选中的概率越高。实际分配比例由各节点 weight 值线性计算得出,例如:
server 192.168.1.10:8080 weight=4;server 192.168.1.11:8080 weight=2;server 192.168.1.12:8080 weight=1;
总权重为 7,对应请求占比约为 57%、29%、14%。未写 weight 的节点默认为 1,可混合使用。
weight 不是静态“固定次数”,而是动态调度权重
Nginx 内部维护三个权重变量:weight(配置值)、effective_weight(运行时可用权重,出错时会临时下调)、current_weight(实时调度计分)。每次选节点时,所有 current_weight 累加 effective_weight,取最大者,再减去总和。这种算法保证长期比例趋近配置值,同时具备容错弹性——某台机器响应失败,它的 effective_weight 会下降,后续请求自然减少流向它。
搭配 least_conn 提升长连接公平性
如果后端有大量耗时操作(如文件上传、导出报表),单纯按权重轮询可能导致某节点连接堆积。启用 least_conn 可让新请求优先落到当前活跃连接最少的节点上,与权重协同工作:
- 在
upstream块开头添加least_conn; - 注意:不能和
ip_hash同时使用,二者互斥 - 适用于连接生命周期较长、响应时间差异大的微服务集群
验证与生效要点
配置不是改完就自动生效,必须走标准流程:
- 用
nginx -t检查语法,避免因空格、分号或大小写错误导致 reload 失败 - Windows 下执行
nginx -s reload需以管理员权限运行命令行 - Linux 下若用 systemd 管理,建议用
sudo systemctl reload nginx - 观察后端 access log 中请求频次,或用简单返回 IP 的页面快速验证分流效果
weight 是启动时加载的静态配置,运行中无法直接修改。如需动态调权,得借助 OpenResty + Lua 或 Nginx Plus 的 API 接口。











