加权轮询不生效主因是请求未进入upstream或配置未正确加载:需确认proxy_pass与upstream名称完全一致、upstream定义在http块顶层、无ip_hash等冲突算法、健康检查未误剔节点,并通过nginx -t和$upstream_addr日志验证实际转发路径。

加权轮询配置不生效,多数情况不是权重数字写错了,而是请求根本没走到你定义的 upstream,或者 upstream 本身没被正确加载和调用。
检查 upstream 是否被 proxy_pass 正确引用
这是最常见也最容易忽略的问题:
- 确认 proxy_pass 后面的地址协议和 upstream 名称完全一致,比如 upstream 名叫
backend_pool,那 proxy_pass 必须写成http://backend_pool(注意双斜杠和名称拼写,不能多空格、不能少冒号) - 检查 location 路径是否意外截断或重写——例如
proxy_pass http://backend_pool/api/;和proxy_pass http://backend_pool/;行为不同,后者会透传原始 URI,前者会把请求路径替换成/api/,可能导致后端 404,误判为“没转发” - 用
nginx -T输出完整生效配置,搜索你的 upstream 名称,确认它确实出现在 http 块里,且没有被重复定义或嵌套在 server 块内(upstream 必须在 http 块顶层)
验证请求是否真进入了目标 upstream
别靠浏览器点几次就下结论,得看日志里实际打到哪台机器:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 在 http 块中添加日志格式:
log_format upstream_log '$remote_addr - $upstream_addr [$time_local] "$request" $status'; - 在对应 location 中启用:
access_log /var/log/nginx/upstream.log upstream_log; - 执行至少 50 次去缓存请求:
for i in {1..50}; do curl -s -H "Cache-Control: no-cache" http://your-nginx-ip/; done - 查日志:
tail -n 50 /var/log/nginx/upstream.log | grep -v "upstream_addr: -",看$upstream_addr字段是否出现多个后端地址
排查干扰性配置冲突
有些配置会直接让 weight 失效,且不报错:
-
ip_hash、least_conn、hash 等算法一旦启用,weight 就被忽略——检查 upstream 块开头有没有
ip_hash;或least_conn; - server 行里混用了
backup或down:比如server 192.168.1.10:8080 weight=0 backup;,此时 backup 优先级更高,可能在主节点全挂时接管流量 - 健康检查误剔除:某台后端响应稍慢或偶发 5xx,Nginx 默认
max_fails=1 fail_timeout=10s就把它标记为 unavailable,权重再高也没用;查 error.log 是否有temporarily disabled记录
确认配置已真实重载且语法无误
改完配置≠生效,必须走完验证闭环:
- 先运行
nginx -t,确保返回successful;如果失败,Nginx 会继续跑旧配置 - 再执行
nginx -s reload(或systemctl reload nginx) - 检查主进程启动时间:
ps -eo pid,comm,lstart | grep nginx,确认时间是修改之后 - 避免本地测试被复用连接干扰:在 location 中加
proxy_http_version 1.1;和proxy_set_header Connection '';,防止 keepalive 导致多次请求落到同一台










