Мы используем 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
}
я хотел бы использовать 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
блок. Итак, вы не можете достичь своей цели таким образом.
Вы можете попробовать что-то вроде назначения файлов cookie для пользователей, заходящих в app-new-test
сервер. Назначение файлов cookie будет выполняться новым приложением, запущенным на сервере.
Затем вы должны проверить значение этого файла cookie в server
блок с 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;
}