Вопрос или проблема
мой upstream:
upstream upstream_**uba1**_console_f485c00e45256742e2cc641db834b150 {
ip_hash;
server 192.30.56.172:39443;
check interval=2000 rise=1 fall=3 timeout=3000;
}
upstream upstream_**uba2**_console_f485c00e45256742e2cc641db834b150 {
ip_hash;
server 192.30.56.173:39443;
check interval=2000 rise=1 fall=3 timeout=3000;
}
мое местоположение:
location /opsuba/ {
if ($args ~* region=(\w+?)(&|$)) {
set $region $1;
}
limit_req zone=reqconsole burst=10000 nodelay;
limit_conn connconsole 1000;
**proxy_pass https://upstream_${region}_console_f485c00e45256742e2cc641db834b150;**
include error_page_exclude_ajax.conf;
include static_file.conf;
access_log off;
}
как я могу сделать так, чтобы upstream_${region}_console_f485c00e45256742e2cc641db834b150
заменялось на переменные?
Вы указываете переменную как $1
(из regexp) или $region
из команды set
.
Это должно работать в вашей конфигурации:
proxy_pass http://upstream_$region_console_f485c00e45256742e2cc641db834b150;
Я только что протестировал это с этим примером конфигурации:
upstream upstream_uba1_console_f485c00e45256742e2cc641db834b150 { ip_hash; server 127.0.0.1:39443; }
upstream upstream_uba2_console_f485c00e45256742e2cc641db834b150 { ip_hash; server 127.0.0.1:39444; }
server {
listen 80;
location ~ ^/([^\/]*) {
proxy_pass http://upstream_$1_console_f485c00e45256742e2cc641db834b150;
}
}
server {
listen 39443;
root /var/www/;
location / {
try_files /url1.html $uri;
}
}
server {
listen 39444;
root /var/www/;
location / {
try_files /url2.html $uri;
}
}
Файлы в файловой системе:
/var/www/url1.html -> содержимое url 1
/var/www/url2.html -> содержимое url 2
Доступ через:
http://localhost/uba1/ -> url1.html
http://localhost/uba2/ -> url2.html
Я все делал с локальными бэкендами, но это будет работать и с вашими.
Также мне пришлось убрать некоторые параметры из вашего блока upstream
, чтобы это работало.
Ответ или решение
Конечно! Давайте разберем, как заменить динамически часть имени upstream на основе переменной, в вашем конфигурационном файле NGINX.
Задача
У вас есть несколько upstream, каждый из которых зависит от переменной region
. Вы хотите использовать этот region
в директиве proxy_pass
для указания правильного upstream в зависимости от переданных аргументов.
Исходные данные
У вас есть следующие upstream:
upstream upstream_uba1_console_f485c00e45256742e2cc641db834b150 {
ip_hash;
server 192.30.56.172:39443;
check interval=2000 rise=1 fall=3 timeout=3000;
}
upstream upstream_uba2_console_f485c00e45256742e2cc641db834b150 {
ip_hash;
server 192.30.56.173:39443;
check interval=2000 rise=1 fall=3 timeout=3000;
}
Конфигурация location
Ваш конфигурационный блок выглядит следующим образом:
location /opsuba/ {
if ($args ~* region=(\w+?)(&|$)) {
set $region $1;
}
limit_req zone=reqconsole burst=10000 nodelay;
limit_conn connconsole 1000;
**proxy_pass https://upstream_${region}_console_f485c00e45256742e2cc641db834b150;**
include error_page_exclude_ajax.conf;
include static_file.conf;
access_log off;
}
Решение
Чтобы использовать переменную в имени upstream, вы можете сделать следующее. Измените строку proxy_pass
так, чтобы она ссылалась на переменную $region
. В вашем случае это будет выглядеть так:
proxy_pass http://upstream_$region_console_f485c00e45256742e2cc641db834b150;
Пример полной конфигурации
Вот как может выглядеть ваша полная конфигурация:
upstream upstream_uba1_console_f485c00e45256742e2cc641db834b150 {
ip_hash;
server 192.30.56.172:39443;
check interval=2000 rise=1 fall=3 timeout=3000;
}
upstream upstream_uba2_console_f485c00e45256742e2cc641db834b150 {
ip_hash;
server 192.30.56.173:39443;
check interval=2000 rise=1 fall=3 timeout=3000;
}
server {
listen 80;
location /opsuba/ {
if ($args ~* region=(\w+?)(&|$)) {
set $region $1;
}
limit_req zone=reqconsole burst=10000 nodelay;
limit_conn connconsole 1000;
proxy_pass http://upstream_$region_console_f485c00e45256742e2cc641db834b150;
include error_page_exclude_ajax.conf;
include static_file.conf;
access_log off;
}
}
Заключение
Эта настройка должна работать правильно при условии, что переменная $region
будет соответствовать тому, что указано в именах ваших upstream. Таким образом, при обращении к адресам, содержащим параметр region
, запрос будет корректно проксироваться на соответствующий upstream сервер.
Если у вас возникнут дополнительные вопросы или нужна помощь с любыми отдельными аспектами конфигурации, не стесняйтесь задавать их!