仅在 nginx 中的单个上游服务器上使用 ip_hash

仅在 nginx 中的单个上游服务器上使用 ip_hash

我们使用 nginx 进行负载平衡。我们刚刚将一台新服务器上线,对我们的平台进行了大规模升级,以便在正式​​推出之前进行测试。我们想确保它能正常工作,所以我们设置了权重,将大约 10% 的流量发送到该服务器。

问题是,我们需要确保如果用户是该服务器的服务器,他们将始终在将来的会话中使用那个服务器。这很容易通过 实现ip_hash,但我们真正想要的是其他服务使用循环策略,而只有该服务器使用 ip_hash。

这样的事真的可能吗?这是我们的upstream.conf

upstream apps  {
   ip_hash;
   server 10.134.13.38:80 weight=3; # app-00
   server 10.134.13.46:80 weight=3; # app-01
   server 10.134.24.30:80 weight=3; # app-02
   server 10.134.8.153:80 weight=1; # app-new-test
}

答案1

我会用split_clients指令并定义两个上游。

upstream apps {
   server 10.134.13.38:80; # app-00
   server 10.134.13.46:80; # app-01
   server 10.134.24.30:80; # app-02
}

upstream apps_new_test {
   server 10.134.8.153:80; # app-new-test
}

split_clients "${remote_addr}AAA" $upstream_app {
    10% apps_new_test;
    *   apps;
}

server {
    ...
    proxy_pass http://$upstream_app;
}

答案2

单个区块使用单一请求分发策略upstream。因此,你无法通过这种方式实现目标。

您可以尝试为访问app-new-test服务器的用户分配 cookie。Cookie 分配将由服务器上运行的新应用完成。

server然后,您将在带有指令的块中测试该 cookie 值if,然后使用proxy_pass http://10.134.8.153;。例如:

server {
    if ($cookie_upstream = "app-test-new") {
        proxy_pass http://10.134.8.153;
    }
    proxy_pass http://apps;
}

相关内容