upstream fail_timeout

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


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;
    }

Maxim Dounin



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