Cookie как механизм для выбора upstream

Материал из База знаний
Перейти к: навигация, поиск

С помощью данного механизма можно принудительно выбирать upstream, на который будет переправлен запрос.

Выделяем каждый backend в отдельную upstream секцию(лучше это сделать в отдельном config):

# Конфигурация Upstream для mysite.example.ru

upstream my-app {
    server 10.10.1.21:443 max_fails=30 fail_timeout=10s;
    server 10.10.1.22:443 max_fails=30 fail_timeout=10s;
    server 10.10.1.23:443 max_fails=30 fail_timeout=10s;
##    server 127.0.0.1:481; # Заглушка (на время обслуживания)
}

upstream my-app-1 {
    server 10.10.1.21:443;
}
upstream my-app-2 {
    server 10.10.1.22:443;
}
upstream my-app-3 {
    server 10.10.1.23:443;
}
upstream my-app-4 {
    server 10.10.1.24:443;
}

В основном конфиге пропишем примерно так:

    # upstream по умолчанию
    set $app_upstream_selected https://my-app;
    # Если установлен Cookie, и он в пределах [1-4] отправим на конкретный upstream
    if ($cookie_MYAPP ~* "^([1-4])$") {
        set $app_num "$1";
        set $app_upstream_selected https://my-$app_num;
    }

    location / {
        # Установим Cookie, если пошли по пути /app-[1-4] в значение номера бекенда.
        if ($request_uri  ~* "^/app-([1-4])$") {
            set $app_num "$1";
            add_header Set-Cookie "myapp=$app_num; Max-Age=86400"; # Время жизни в секундах
            rewrite ^ https://$host;
        }
        if ($request_uri  ~* "^/app-all$") {
            add_header Set-Cookie "myapp=0; Max-Age=1";
            rewrite ^ https://$host;
        }


        proxy_pass $app_upstream_selected;