URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 7979
[ Назад ]

Исходное сообщение
"Один url в location и два бэкенда"

Отправлено hd , 22-Июн-15 16:54 
Здравствуйте.

Пытаюсь сделать что-то такое:

location /url/aaa {
  proxy_pass backend1;
}

location /url {
  proxy_pass backend2;
}

Но запросы все время попадают на backend2. Делать "location = /url/aaa" нельзя, т.к. еще бывает /url/aaa/xyz итд. Как подобное решается? Заранее спасибо.


Содержание

Сообщения в этом обсуждении
"Один url в location и два бэкенда"
Отправлено PavelR , 22-Июн-15 19:44 
> Здравствуйте.
> Пытаюсь сделать что-то такое:
> location /url/aaa {
>   proxy_pass backend1;
> }
> location /url {
>   proxy_pass backend2;
> }
>Как подобное решается?

Так и решается, как вы написали.

> Но запросы все время попадают на backend2.

Значит вы что-то сделали не так, как написали.

Попробуйте сделать рестарт.


"Один url в location и два бэкенда"
Отправлено eRIC , 22-Июн-15 20:16 
> Здравствуйте.
> Пытаюсь сделать что-то такое:
> location /url/aaa {
>   proxy_pass backend1;
> }
> location /url {
>   proxy_pass backend2;
> }
> Но запросы все время попадают на backend2. Делать "location = /url/aaa" нельзя,
> т.к. еще бывает /url/aaa/xyz итд. Как подобное решается? Заранее спасибо.

location ^~ /url/ {
  proxy_pass backend2;
}

location ^~ /url/aaa/ {
  proxy_pass backend1;
}


"Один url в location и два бэкенда"
Отправлено PavelR , 22-Июн-15 20:27 
>> Но запросы все время попадают на backend2. Делать "location = /url/aaa" нельзя,
>> т.к. еще бывает /url/aaa/xyz итд. Как подобное решается? Заранее спасибо.
> location ^~ /url/ {
>   proxy_pass backend2;
> }
> location ^~ /url/aaa/ {
>   proxy_pass backend1;
> }

Вы читали документацию, зачем нужен модификатор ^~ ?
Нет, не читали? А зачем советуете?


"Один url в location и два бэкенда"
Отправлено eRIC , 22-Июн-15 21:37 
>>> Но запросы все время попадают на backend2. Делать "location = /url/aaa" нельзя,
>>> т.к. еще бывает /url/aaa/xyz итд. Как подобное решается? Заранее спасибо.
>> location ^~ /url/ {
>>   proxy_pass backend2;
>> }
>> location ^~ /url/aaa/ {
>>   proxy_pass backend1;
>> }
> Вы читали документацию, зачем нужен модификатор ^~ ?
> Нет, не читали? А зачем советуете?

читано и это работает. мне тыкнуть в доку? http://nginx.org/ru/docs/http/ngx_http_core_module.html


"Один url в location и два бэкенда"
Отправлено PavelR , 22-Июн-15 22:18 
>> Вы читали документацию, зачем нужен модификатор ^~ ?
>> Нет, не читали? А зачем советуете?
> читано и это работает.

Работает и без модификатора ^~.

>мне тыкнуть в доку? http://nginx.org/ru/docs/http/ngx_http_core_module.html

Тыкните, вам лишним не будет перечитать её и дать ответ на вопрос, зачем нужен модификатор ^~.


"Один url в location и два бэкенда"
Отправлено eRIC , 23-Июн-15 14:35 
> Работает и без модификатора ^~.

да работает, если URI будут примитивные как школьные уроки


"Один url в location и два бэкенда"
Отправлено erera22 , 23-Июн-15 12:16 
>[оверквотинг удален]
>>>> т.к. еще бывает /url/aaa/xyz итд. Как подобное решается? Заранее спасибо.
>>> location ^~ /url/ {
>>>   proxy_pass backend2;
>>> }
>>> location ^~ /url/aaa/ {
>>>   proxy_pass backend1;
>>> }
>> Вы читали документацию, зачем нужен модификатор ^~ ?
>> Нет, не читали? А зачем советуете?
> читано и это работает. мне тыкнуть в доку? http://nginx.org/ru/docs/http/ngx_http_core_module.html

То, что это "работает", не значит, что стоит так делать в сознательном состоянии.


"Один url в location и два бэкенда"
Отправлено eRIC , 23-Июн-15 14:31 
> То, что это "работает", не значит, что стоит так делать в сознательном
> состоянии.

вот почему:

Проиллюстрируем вышесказанное примером:

    location = / {
        [ конфигурация А ]
    }

    location / {
        [ конфигурация Б ]
    }

    location /documents/ {
        [ конфигурация В ]
    }

    location ^~ /images/ {
        [ конфигурация Г ]
    }

    location ~* \.(gif|jpg|jpeg)$ {
        [ конфигурация Д ]
    }

Для запроса “/” будет выбрана конфигурация А, для запроса “/index.html” — конфигурация Б, для запроса “/documents/document.html” — конфигурация В, для запроса “/images/1.gif” — конфигурация Г, а для запроса “/documents/1.jpg” — конфигурация Д.


Теперь представь запрос: http://dummy/url/aaa/site.aaa и следующий конфиг:

location /url/aaa {
echo "1 block";
}

location /url {
echo "2 block";
}

location ~* \.(url|aaa)$ {
echo "3 block";
}


Какой будет вывод? Правильно: 3 block

Но автор скажет, мля че за Х, когда он должен отрабатываться 1 block'ом, потому что это подзапросы /url/aaa/*

Ну теперь проверь этот конфиг:

location ^~ /url/aaa {
echo "1 block";
}

location ^~ /url {
echo "2 block";
}

location ~* \.(url|aaa)$ {
echo "3 block";
}


видимо автору пох* наше обсуждение :)


"Один url в location и два бэкенда"
Отправлено PavelR , 24-Июн-15 07:11 
> Какой будет вывод? Правильно: 3 block
> Но автор скажет, мля че за Х, когда он должен отрабатываться 1
> block'ом, потому что это подзапросы /url/aaa/*

Ну так ситуации разные бывают. Где-то должно отработать 1-м блоком, где-то 3-м.

практический пример 1, тут нужна ^~, т.к. это фактически две разных системы, разнесенные по URL:

server {

...

    root /var/lib/roundcube/;

    location / {
        index index.php;
    }

    ......

    location = /robots.txt {}
    location = /favicon.ico {}
    location ~* \.(gif|jpg|jpeg|bmp|js|json|exe|css|swf|mp3|mp4|avi|mkv|mov|png|ico|wav|wmv|wma|mpeg|rar|zip|mpg|flv|flac|fla|rm|asf|cur|pdf)$ {}


   location ^~ /postfixadmin/ {
        alias /usr/share/postfixadmin/;
        index index.php;

        location ~ \.php$ {
            fastcgi_pass ....;
            fastcgi_index index.php;
            include fastcgi_params;
        }
    }

....
}


практический пример 2, тут не нужна ^~, т.к. это тот же сайт, разнесенный на разные бекенды с общим каталогом статики


server {

...

    root /var/www/cool.site.example.net/;

    location / {
       proxy_pass upstream-user;
    }

    location /adminpanel/ {
       proxy_pass upstream-admin;
    }

    ......

    location = /robots.txt {}
    location = /favicon.ico {}
    location ~* \.(gif|jpg|jpeg|bmp|js|json|exe|css|swf|mp3|mp4|avi|mkv|mov|png|ico|wav|wmv|wma|mpeg|rar|zip|mpg|flv|flac|fla|rm|asf|cur|pdf)$ {}

....
}

Хотя таки да, варианты с ^~ встречаются чаще, чем без модификатора.
Отдельно хочу обратить внимание на то, что модификатором ^~ также отключаются "защитные" локейшны, если они есть:

    location ~ /\.ht  {  deny all; }
    location ~ /\.svn/ {  deny all; }
    location ~ /\.git/ {  deny all; }


"Один url в location и два бэкенда"
Отправлено eRIC , 24-Июн-15 09:28 
>[оверквотинг удален]
> {}
> ....
> }
> Хотя таки да, варианты с ^~ встречаются чаще, чем без модификатора.
> Отдельно хочу обратить внимание на то, что модификатором ^~ также отключаются "защитные"
> локейшны, если они есть:
>     location ~ /\.ht  {  deny all;
> }
>     location ~ /\.svn/ {  deny all; }
>     location ~ /\.git/ {  deny all; }

да верное замечание, потому что поиск по другим регуляркам не производится