Редирект с баланcингом

Maxim Dounin mdounin at mdounin.ru
Fri Sep 26 16:10:11 MSD 2008


Hello!

On Fri, Sep 26, 2008 at 01:11:31PM +0600, Rauan Maemirov wrote:

>>Если хочется получить именно редирект, и при этом с хешированием по
>ip-адресам - напишите простое хеширование на >if'ах/map'ах, либо на
>встроенном perl'е.
>
>Пытаюсь сделать на map'ах. Но не пойму как написать  "простое хеширование на
>if'ах/map'ах". Так как у меня нужно редиректить только один location, map
>выдает ошибки...
>
>    map $uri $new {
>        /one   http://site1.example.com/one/;
>        /one   http://site2.example.com/one/;
>    }

А в чём смысл такой конструкции?  Что, есть надежда что 
засовывание в ассоциативный массив двух значений с одним и тем же 
ключём приведёт к тому что они волшебным образом начнут 
возвращаться по очереди в зависимости от ip-адреса клиента и 
погоды на марсе? 

Мапы надо делать не на $uri, а на [части] ip. И потом использовать 
результат в rewrite.  Как-то так:

map $net $site {
     0  1;
     1  2;
     2  1;
     3  2;
     ...
}

location /one {
     if ($remote_addr ~ '^\d+\.\d+\.(\d+)') {
         set $net $1;
         rewrite ^ http://site$site.example.com/one;
     }
}

Maxim Dounin


>
>2008/9/25 Maxim Dounin <mdounin at mdounin.ru>
>
>> Hello!
>>
>> On Thu, Sep 25, 2008 at 06:05:32PM +0600, Rauan Maemirov wrote:
>>
>>  Здравствуйте.
>>>
>>> Помогите, пожалуйста, организовать редирект.
>>>
>>> В сервере example.com есть апстрим.
>>>
>>> upstream site {
>>>       ip_hash;
>>>
>>>       server   site1.example.com;
>>>       server   site2.example.com;
>>>   }
>>>
>>> и есть location
>>>
>>>       location ^~ /one {
>>>           proxy_pass     http://site/one;
>>>           proxy_redirect default;
>>>       }
>>>
>>> Т.е. при обращении на example.com/one он должен редиректиться на
>>> site1.example.com/one или site2.example.com/one. rewrite не подходит, так
>>> как мне нужен редирект с ip_hash.
>>>
>>
>> Редирект - это возврат http-ответа 302 Found (либо 301, 307), его делает
>> именно rewrite.  То, что делает proxy_pass - это проксирование.
>>
>> Если хочется получить именно редирект, и при этом с хешированием по
>> ip-адресам - напишите простое хеширование на if'ах/map'ах, либо на
>> встроенном perl'е.
>>
>>  Получаю "worker_connections is not enough while connecting to upstream"
>>> или
>>> "no live upstreams while connecting to upstream".
>>>
>>> Насколько я понял, он зацикливается. Но никак не могу понять почему.
>>>
>>
>> Судя по всему - site1.example.com и site2.example.com указывают на ту же
>> машину, и при этом запрос попадает на обработку к тому же proxy_pass'у и так
>> далее - пока у nginx'а не кончаться соединения.
>>
>> Maxim Dounin
>>
>>





More information about the nginx-ru mailing list