我们使用nginx进行负载平衡。 在推出之前,我们只是推出了一个新的服务器,并对我们的平台进行了大规模的升级testing。 我们希望确保它能正常工作,所以我们有权设置为将大约10%的stream量发送到该服务器。
问题是,我们需要确保如果用户是服务器的服务器,他们将永远得到该服务器为未来的会议。 这很容易用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 }
我会使用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; }
单个upstream
模块使用单个请求分配策略。 所以,你不能这样实现你的目标。
您可以尝试为来到app-new-test
服务器的用户分配Cookie。 cookie分配将由服务器上运行的新应用程序完成。
然后你可以使用if
指令在server
块中testing这个cookie值,然后使用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; }