You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx如何将同URL路径流量按比例拆分到两个不同upstream?

答复

嵌套upstream配置支持性结论

Nginx不支持upstream块嵌套定义的语法,你尝试编写的嵌套upstream配置属于非法配置,Nginx重载时会直接抛出语法错误,无法正常生效。

你之前对split_clients模块的作用存在误解:该模块的核心能力是基于哈希规则按比例设置自定义变量,并非只能修改请求路径,完全可以满足同一路径下按比例分流到不同upstream、且不修改请求原始内容的需求,是这类场景的标准实现方案。

标准实现配置

第一步:定义流量拆分规则

在http块层级(与upstream、server块同级)添加split_clients配置,基于客户端特征做哈希分流,保证流量均匀:

# 基于客户端IP+请求ID做哈希,按1%/99%比例分配后端
split_clients "${remote_addr}${request_id}" $target_upstream {
    1%    upstream_2;
    *     upstream_1;
}

如果需要保证同一客户端始终落到同一个后端,可以调整哈希因子为固定的客户端标识,比如仅用$remote_addr、$http_x_forwarded_for等。

第二步:调整location转发规则

保留原有upstream配置不变,将location内的uwsgi_pass指向分流生成的变量,同时保留标准uwsgi转发参数保证请求原样透传:

upstream upstream_1 {
    server some_container_1:8000;
}

upstream upstream_2 {
    server some_container_2:8001;
}

split_clients "${remote_addr}${request_id}" $target_upstream {
    1%    upstream_2;
    *     upstream_1;
}

server {
    listen       7000;
    server_name  localhost;
    location /path {
        uwsgi_pass  $target_upstream;
        # 以下为标准uwsgi转发参数,保证请求头、路径、参数完全原样转发,和原有转发行为一致
        uwsgi_param QUERY_STRING       $query_string;
        uwsgi_param REQUEST_METHOD     $request_method;
        uwsgi_param CONTENT_TYPE       $content_type;
        uwsgi_param CONTENT_LENGTH     $content_length;
        uwsgi_param REQUEST_URI        $request_uri;
        uwsgi_param PATH_INFO          $document_uri;
        uwsgi_param SERVER_PROTOCOL    $server_protocol;
        uwsgi_param REMOTE_ADDR        $remote_addr;
        uwsgi_param REMOTE_PORT        $remote_port;
        uwsgi_param SERVER_PORT        $server_port;
        uwsgi_param SERVER_NAME        $server_name;
    }
}

配置校验

修改完成后执行nginx -t校验配置语法,确认无报错后执行nginx -s reload重载配置即可生效。该方案不会修改请求路径、请求头、请求体内容,完全匹配你的需求。


内容的提问来源于stack exchange,提问作者gabriel119435

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:33:29