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;