upstream必须定义在http块顶层,不可置于server或location内;正确配置需在http块中定义带weight的upstream组,并在location中用proxy_pass http://upstream_name引用,方可实现权重分发与健康检查等高级功能。

不能在 location 块里定义 upstream,upstream 必须写在 http 块内、所有 server 块之外。所谓“通过 location 块的 upstream 配置”,实际是指:在某个 location 中,用 proxy_pass 指向一个已定义好的、带权重的 upstream 名称,从而让该接口的流量按权重分发到后端异构服务器。
upstream 必须定义在 http 块顶层
这是最关键的前置条件。如果 upstream 写在 server 或 location 里,Nginx 启动会报错或权重完全不生效。
- 正确位置:
http { upstream my_api { server 192.168.1.10:8080 weight=3; server 192.168.1.11:8080 weight=1; } ... } - 错误写法:
server { location /api/ { upstream my_api { ... } } }(语法非法) - 权重数值为正整数,默认是 1;不需要归一化,Nginx 自动按比例分配流量
location 中必须用 proxy_pass 引用 upstream 名称
只有通过 proxy_pass http://upstream_name 的方式,才能激活 upstream 定义的调度逻辑(包括 weight、max_fails 等)。
- 正确写法:
location /api/v1/ { proxy_pass http://my_api; } - 错误写法:
proxy_pass http://192.168.1.10:8080;(绕过 upstream,退化为直连) - 错误写法:
proxy_pass my_api;(缺http://协议头,Nginx 无法识别为 upstream 引用)
针对特定接口做差异化权重分配
不同接口可对应不同 upstream,实现细粒度控制。比如高并发查询接口用高性能节点,低频管理接口用普通节点。
- 定义两个 upstream:
upstream api_read { server 10.0.1.10:8000 weight=4; server 10.0.1.11:8000 weight=1; }和upstream api_admin { server 10.0.1.20:8000 weight=1; } - 分别绑定 location:
location /api/v1/query { proxy_pass http://api_read; }和location /api/v1/admin { proxy_pass http://api_admin; } - 注意路径结尾斜杠影响重写行为:若
proxy_pass http://api_read;(无尾部 /),则/api/v1/query/foo会被完整转发为http://10.0.1.10:8000/api/v1/query/foo
配套建议提升稳定性与可追溯性
仅配 weight 不足以应对生产环境,建议同步加入健康检查和请求头透传。
- 为每个 server 添加
max_fails=2 fail_timeout=30s,自动剔除临时不可用节点 - 在 location 中加上:
proxy_set_header Host $host;和proxy_set_header X-Real-IP $remote_addr;,保留原始客户端信息 - 避免混用算法:weight 与
ip_hash、hash $request_uri等 hash 类指令互斥,不可共存于同一 upstream 块


















