Cookie как механизм для выбора upstream — различия между версиями
Материал из База знаний
Admin (обсуждение | вклад) (Новая страница: «category:Nginx * С помощью данного механизма можно принудительно выбирать upstream, на который бу…») |
Admin (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
[[category:Nginx]] | [[category:Nginx]] | ||
| − | + | '''С помощью данного механизма можно принудительно выбирать upstream, на который будет переправлен запрос.''' | |
| + | |||
| + | Выделяем каждый backend в отдельную upstream секцию(лучше это сделать в отдельном config): | ||
| + | <pre> | ||
| + | # Конфигурация 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; | ||
| + | } | ||
| + | </pre> | ||
| + | |||
| + | В основном конфиге пропишем примерно так: | ||
| + | <pre> | ||
| + | # 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; | ||
| + | </pre> | ||
Текущая версия на 09:32, 28 марта 2025
С помощью данного механизма можно принудительно выбирать 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;