如何将来自相同 url 路径的流量拆分到 2 个不同的上游?

how to split traffic from same url path to 2 different upstreams?

我声明了这些上游:

upstream upstream_1 {
    server some_container_1:8000;
}

upstream upstream_2 {
    server some_container_2:8001;
}

和这个服务器:

server {
    listen       7000;
    server_name  localhost;
    location /path {
        uwsgi_pass  upstream_1;
    }
}

其中 some_container_1some_container_2 都基于相同的图像(因此在相同的路径上提供相同的 api)但在环境变量和其他不相关的东西上有所不同。我想分叉所有流量的 1% 从 localhost:7000/path 传送到 'as is' 到 upstream_2,99% 留在 upstream_1。这两种情况都应保持收到的请求,既不改变路径也不改变 headers

with split_clients 我可以在将请求转发到单个上游之前分叉将设置的路径,这不是我的情况。

here 分叉是在服务器之间的上游内部完成的,而不是像我需要的那样在上游之间的位置分裂内完成的。

我可以定义上游的上游吗

upstream compound_upstream_1 {
    upstream upstream_1 weight=99;
    upstream upstream_2;
}

用于

server {
    listen       7000;
    server_name  localhost;
    location /path {
        uwsgi_pass  compound_upstream_1;
    }

nginx 可以吗?考虑到这一点,哪种方式应该是实现这一目标的标准?

也许可以使用负载均衡器来完成此操作:https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/

我不确定你的“1%”场景的权重是多少,但你可以玩弄它并根据自己的喜好进行调整。

我不明白,是什么阻止你直接在上游块中使用服务器名称?

upstream compound_upstream_1 {
    server some_container_1:8000 weight=99;
    server some_container_2:8001;
}
server {
    listen       7000;
    server_name  localhost;
    location /path {
        uwsgi_pass  compound_upstream_1;
    }
}

或者我误解了你的问题?