Nginx 的加权轮询由 upstream 块中 server 的 weight 参数控制,upstream 必须定义在 http 块内,proxy_pass 需以 http://upstream_name 格式引用;权重为相对整数,未设则默认为 1,且需透传 Host、X-Real-IP 等请求头以保障后端获取真实客户端信息。

在 Nginx 中,proxy_pass 本身不决定轮询方式,它只是把请求转发给 upstream 定义的服务组;真正的加权轮询行为由 upstream 块中的 weight 参数控制。只要 upstream 内各 server 显式设置了 weight,Nginx 就会按权重比例分发请求。
upstream 必须放在 http 块里
upstream 不能写在 server 或 location 里,只能位于 http { ... } 范围内。名称可自定义(如 api_cluster),但后续 proxy_pass 引用时必须完全一致:
- 错误写法:
upstream放在server块里 → 配置无效 - 正确结构:先在
http块中定义upstream backend { server a weight=3; server b weight=1; } - 再在
location中写proxy_pass http://backend;(注意协议前缀和末尾斜杠)
weight 参数决定流量分配比例
权重值是相对整数,不强制要求总和为 100。比如 weight=6 和 weight=2 等效于 3:1;三台服务器设为 weight=3、weight=5、weight=2,实际请求比例就是 3:5:2。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 未写 weight 时,默认为 1,等同于普通轮询
- 权重只影响请求分发频次,不改变连接超时、重试等行为
- 高权重服务器若宕机,Nginx 仍会按健康检查结果自动跳过它(需配合
max_fails/fail_timeout)
proxy_pass 的写法很关键
proxy_pass 必须带 http:// 协议头和 upstream 名称,否则就变成直连单点,绕过负载均衡:
- ✅ 正确:
proxy_pass http://backend;或proxy_pass http://backend/; - ❌ 错误:
proxy_pass http://192.168.1.10:8080;(直接地址,无轮询) - 末尾斜杠影响路径重写:带
/会剥离 location 匹配路径,不带则原样拼接
别漏掉关键请求头透传
后端服务要拿到真实客户端信息,必须显式设置以下 header:
-
proxy_set_header Host $host;—— 传递原始域名 -
proxy_set_header X-Real-IP $remote_addr;—— 客户端真实 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 补全多层代理的 IP 链
改完配置后,务必运行 sudo nginx -t 验证语法,再用 sudo nginx -s reload 平滑生效。可通过反复访问并查看各后端 access 日志,确认请求是否按预期权重比例出现。

















