ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
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


 




Copyright © Lexa Software, 1996-2009.