我们使用 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;
}