Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: upstream fail_timeout
Максим, еще раз спасибо.
Комментарии ниже.
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 mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru
|