LINUX.ORG.RU

Nginx, выбрать backend в зависимости от аргумента


0

0

Добрый день,

Например, есть запрос:

http://somesite.org/profile?user_id=1

И есть 2 бэкэнда: http://backend1.org:8888 http://backend2.org:8889

Как грамотно раскидывать запросы на бэкэнды в зависимости от параметра user_id? Надо что-то сделать с переменной $arg_user_id, но описание синтаксиса конфига Nginx я просто не нашел!

P.S. Раскидывание по IP с помощью директивы backend не подходит. Нужно именно по user_id.

★★

> описание синтаксиса конфига Nginx я просто не нашел!

А вы у себя на локальном компе искали? :) Гугль дает сотни тысяч ссылок по настройке энджинкса. В том числе и по embedded perl

boombick ★★★★★
()
Ответ на: комментарий от boombick

>Гугль дает сотни тысяч ссылок по настройке энджинкса

Давайте уже определённо.
Или «Гугль дает сотни тысяч по настройке энджинкса».
Или, там, «Гугль дает over 9k ссылок по настройке энджинкса».
Совсем хорошо - «Гугль дает множество ссылок по настройке энджинкса».

Но фраза «Гугль дает сотни тысяч ссылок по настройке энджинкса» - это явное 4.2.

KRoN73 ★★★★★
()
Ответ на: комментарий от true_admin

различный proxy_pass в if в зависимости от $arg_user_id
описание переменных: http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html#variables

location / {
    set $port 10022; # default
    if ($arg_user_id ~ .*[01234]$) {
        set $port 10022;
    }
    if ($arg_user_id ~ .*[56789]$) {
        set $port 10023;
    }
    proxy_pass         http://0.0.0.0:$port;
    proxy_redirect     off;
    add_header         Cache-Control  no-cache;
    add_header         Pragma  no-cache;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
}

Я пробовал так, при этом почему-то переменная $port в директиве proxy_pass не учитывалась. Nginx сыпал ошибками: «Invalid port in upstream http://0.0.0.0

Kpoxman ★★
() автор топика
Ответ на: комментарий от boombick

>> описание синтаксиса конфига Nginx я просто не нашел!

А вы у себя на локальном компе искали? :) Гугль дает сотни тысяч ссылок по настройке энджинкса. В том числе и по embedded perl

Я перерыл практически весь раздел документации в sysoev.ru. Но на ngx_http_perl_module, каюсь, обратил внимание впервые. Интуитивно непонятно, что ngx_http_perl_module это встроенный перл, а не аналог, скажем, mod_perl.

Kpoxman ★★
() автор топика
Ответ на: комментарий от Kpoxman

Перенеси просто строчку proxy_pass в соответствующий условный блок.

У меня, типа такого используется:


       location / {
            if ( $host ~ "(www\.)?(airbase.ru|balancer.ru|files.balancer.ru|forums.airbase.ru|89.108.118.15)" ) {
                access_log      off;
                proxy_pass http://89.108.118.15:8185;
            }
            if ( $host ~ "(www\.)?(admin.airbase.ru|afap.ru|alertcharm.ru|alw.wrk.ru|amaliya.spb.ru|aquakosh.spb.ru|au.wrk.ru|bionco.ru|bp.
                access_log      off;
                proxy_pass http://89.108.118.15:8184;
            }

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Перенеси просто строчку proxy_pass в соответствующий условный блок.

Если так работает, то отлично! Спасибо.

Но все ж интересно, почему мой вариант не работает? Нельзя в proxy_pass переменные использовать в аргументе?

Кстати, то, что у вас сделано ведь можно сделать через virtual hosts, с помощью директив server и server_name, не анализируя $host. Или там по другим причинам?

Kpoxman ★★
() автор топика
Ответ на: комментарий от Kpoxman

>Или там по другим причинам?

Не помню уже. Давно настраивал.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.