Назад | Перейти на главную страницу

Использование ip_hash на ОДНОМ восходящем сервере только в nginx

Мы используем 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;
}