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

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