nginx加权轮询配置需严格遵循三点:权重必须写在upstream内server行末尾且格式正确(如weight=5)、upstream名称在proxy_pass中大小写完全一致、修改后必须nginx -t校验并nginx -s reload重载。

Linux 下 Nginx 加权轮询(Weighted Round Robin)配置不难,但细节决定成败。权重写错、没重载、引用名不一致——这些小问题都会让配置完全不生效。关键就三点:语法绝对严格、位置必须正确、改完必须校验重载。
加权轮询的正确写法
权重只能加在 upstream 块内的 server 行末尾,且必须在同一行、无换行、无多余空格、无引号、无分号以外的标点:
- ✅ 正确:
server 192.168.1.10:8080 weight=5; - ❌ 错误:
server 192.168.1.10:8080 weight = 5;(等号前后有空格) - ❌ 错误:
server 192.168.1.10:8080<br>weight=5;
(换行,Nginx 解析失败) - ❌ 错误:
server 192.168.1.10:8080 weight="5";(字符串不支持)
weight 后面只接受正整数,比如 1、2、10、100 都可以;比值才重要,weight=4 和 weight=2 等同于 weight=2 和 weight=1,实际流量比都是 2:1。
配置结构与上下游关联
加权轮询不是独立功能,它依赖两个环节配合:
- 在
http块里定义upstream,名称自定(如api_cluster),每台后端 server 行带上 weight; - 在某个
server块的location中,用proxy_pass http://api_cluster;引用——注意名称必须**完全一致、大小写敏感**; - 未写 weight 的 server 默认 weight=1;三台服务器设为
weight=4、weight=2、weight=2,总权重 8,对应流量占比就是 50% : 25% : 25%。
必须执行的生效动作
改完配置文件只是第一步,Nginx 不会自动读取新内容:
- 先运行
nginx -t检查语法,输出 “syntax is ok” 和 “test is successful” 才算通过; - 再执行
nginx -s reload(或systemctl reload nginx),平滑重载配置; - 旧 worker 进程仍按老规则运行,不 reload 就等于没改;
- 建议搭配
max_fails=3 fail_timeout=30s使用,比如server 192.168.1.11:8080 weight=2 max_fails=3 fail_timeout=30s;,提升容错能力。
常见误判与验证方法
别光看配置“像对了”,要验证是否真生效:
- 用
curl -I http://你的负载均衡地址多次请求,观察响应头中的Server或自定义X-Backend字段(需后端配合返回标识); - 检查各后端服务器访问日志,统计单位时间内请求数,确认比例接近预设权重比;
- 不要用浏览器直接刷——缓存和复用连接会影响结果,用
for i in {1..20}; do curl -s http://lb-ip/; done更可靠; - 如果所有请求都打到同一台,优先排查:
proxy_pass名称拼错、upstream定义不在http块内、没 reload、某台 server 地址不可达导致被临时剔除。











