Re: несколько уровней upstream

Maxim Dounin mdounin на mdounin.ru
Вт Авг 11 12:50:38 UTC 2015


Hello!

On Tue, Aug 11, 2015 at 11:38:07AM +0300, denis wrote:

> 10.08.2015 12:52, denis пишет:
> >Добрый день
> >
> >как сделать такое:
> >первый запрос - всегда на основной апстрим, при таймауте на него же через
> >другой порт, и там неудача - на резерв. Последнее через backup, а как
> >первые два сделать? Второму серверу weight=0?
> можно ли сделать try_files @first @second @third =404?

Можно, но оно будет делать не то, о чём вы подумали.  Все 
аргументы try_files, кроме последнего - это файлы, существование 
которых будет проверяться на диске.

Если нужно, чтобы в случае ошибок от бекенда обработка уходила в 
другой location, то следует пользоваться директивой error_page, 
см. http://nginx.org/r/error_page/ru.  Там, в частности, есть 
пример такого вида:

    location / {
        error_page 404 = @fallback;
    }

    location @fallback {
        proxy_pass http://backend;
    }

Таким образом можно обеспечить произвольную многоуровневую 
обработку запроса.  Чуть более сложный пример есть в описании 
модуля memcached, 
http://nginx.org/ru/docs/http/ngx_http_memcached_module.html:

    location / {
        set            $memcached_key "$uri?$args";
        memcached_pass host:11211;
        error_page     404 502 504 = @fallback;
    }

    location @fallback {
        proxy_pass     http://backend;
    }

В случае, если требуется более одного перенаправления, необходимо 
также разрешить множественные перенаправления с помощью директивы 
recursive_error_pages, см. http://nginx.org/r/recursive_error_pages/ru.

Ну и не надо забывать, что явно описанная группа серверов сама по 
себе обеспечивает опрос нужного количества серверов в случае 
ошибок, см. http://nginx.org/r/proxy_next_upstream/ru.

-- 
Maxim Dounin
http://nginx.org/



Подробная информация о списке рассылки nginx-ru