upstream fail_timeout

Sergey Kobzar sergey.kobzar на itcraft.org
Сб Окт 22 15:08:43 UTC 2011


Максим, еще раз спасибо.

Комментарии ниже.

On 10/21/11 18:13, Maxim Dounin wrote:

>>>> У меня задача - если все бэкенды в дауне, выводит 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;
>          }
>      }

Есть одна проблема при max_fails > 1 - клиенту будет одана стандартная 
error page, N раз (пока Nginx не выкинет дохлый бэкенд из пула). В 
принципе это не критично при высокой нагрузке, т.к. пострадают всего 
пару человек. Решение - описать custom error page 2 раза - на фронтенде 
+ на backup сервере.

Получилось так-то так:

upstream backend {
         server 10.11.9.2 max_fails=2 fail_timeout=300s;
         server 10.11.9.3 max_fails=2 fail_timeout=300s;
         server 127.0.0.1 backup;
         ip_hash;
}

server {
         listen 127.0.0.1;
         server_name localhost;

         access_log /var/log/nginx/localhost_access.log main;
         error_log /var/log/nginx/localhost_error.log info;

         location / {
                 error_page 502 504 /server_errors/500.html;
                 return 502;
         }

         location ^~ /server_errors/ {
                 root /home/www/localhost/htdocs;
                 expires max;
         }
}

server {
         listen 80 default;
         server_name localhost;

         access_log /var/log/nginx/default_access.log main;
         error_log /var/log/nginx/default_error.log info;

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

         error_page 502 504 /server_errors/500.html;

         location ^~ /server_errors/ {
                 root /home/www/localhost/htdocs;
                 expires max;
         }
}

Так вроже бы все работает как и требовалось.


>
> Maxim Dounin
>



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