upstream fail_timeout

Maxim Dounin mdounin на mdounin.ru
Пт Окт 21 15:13:46 UTC 2011


Hello!

On Fri, Oct 21, 2011 at 05:57:06PM +0300, Sergey Kobzar wrote:

> Максим.
> 
> On 10/21/11 16:05, Maxim Dounin wrote:
> >Hello!
> >
> >On Fri, Oct 21, 2011 at 03:52:02PM +0300, Sergey Kobzar wrote:
> >
> >>On 10/21/11 15:41, Maxim Dounin wrote:
> >>>Hello!
> >>>
> >>>On Fri, Oct 21, 2011 at 02:46:45PM +0300, Sergey Kobzar wrote:
> >>>
> >>>>On 10/20/11 15:59, Sergey Kobzar wrote:
> >>>>>Конфиг:
> >>>>>
> >>>>>proxy_connect_timeout 5;
> >>>>>
> >>>>>upstream backend {
> >>>>>server 10.0.0.1 max_fails=3 fail_timeout=300s;
> >>>>>server 10.0.0.2 max_fails=3 fail_timeout=300s;
> >>>>>ip_hash;
> >>>>>}
> >>>>>
> >>>>>location / {
> >>>>>proxy_pass http://backend;
> >>>>>proxy_next_upstream error timeout http_502 http_504;
> >>>>>
> >>>>>proxy_set_header Host $host;
> >>>>>proxy_set_header X-Real-IP $remote_addr;
> >>>>>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
> >>>>>}
> >>>>>
> >>>>>Оба бэкенда в дауне (полностью лежат). В не зависимости от числа
> >>>>>запросов и времени между запросами, каждый раз жду ответа по 10 секунд.
> >>>>>
> >>>>>Хотя... каждый четвертый ответ приходит сразу.
> >>>>>
> >>>>>Что не так? Почему оба сервера не признаются не работающими в течении
> >>>>>300 сек?
> >>>>>
> >>>>>nginx/1.0.6
> >>>>
> >>>>No ideas?
> >>>
> >>>Если nginx обнаруживает, что все бекенды в дауне, он сбрасывает
> >>>счётчики ошибок, и очередной запрос снова пытается идти на
> >>>бекенды.
> >>
> >>Максим, спасибо.
> >>
> >>Плохо.
> >>
> >>У меня задача - если все бэкенды в дауне, выводит custom error page.
> >>А получается при proxy_connect_timeout 5 и 4х бэкендах, пользователь
> >>будет ждать 2 секунд.
> >>
> >>Решения я так понимаю нет?
> >
> >Стандартное решение - сделать backup сервер, с которого и отдавать
> >"custom error page".
> >
> >С ip_hash там могут быть нюансы (вообще говоря, ip_hash не
> >поддерживает backup, и если написать ip_hash до определения
> >backup-сервера - даже ругается).  Но теоретически должно
> >заработать как-то так:
> >
> >     upstream backend {
> >        server 192.2.0.1;
> >        server 192.2.0.2;
> >        server 127.0.0.1:8080 backup;
> >        ip_hash;
> >     }
> 
> До server 127.0.0.1:8080 backup не додумался.
> 
> Хм, а как тогда отдать клиенту 502 скажем вместе со странице от
> 127.0.0.1:8080?

Какой именно код отдать клиенту - будет решать собственно 
backup-сервер (127.0.0.1:8080).

Если на фронтенде стоит error_page 502 и используется 
proxy_intercept_errors - то на backup-сервере можно просто сделать 
"return 502", как-то так:

    server {
        listen 127.0.0.1:8080;
        return 502;
    }

Если на фронтенде не используется proxy_intercept_errors, то 
"return 502" + "error_page 502 /502.html" + location для 
/502.html, как-то так:

    server {
        listen 127.0.0.1:8080;

        location / {
            error_page 502 /502.html;
            return 502;
        }

        location = /502.html {
            root /path/to;
        }
    }
 
Maxim Dounin



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