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