nginx 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  /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 сервер.

Если у вас возникнут дополнительные вопросы или нужна помощь с любыми отдельными аспектами конфигурации, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...