Re: Балансировка нагрузки при недоступности backend

Maxim Dounin mdounin на mdounin.ru
Пт Ноя 9 14:42:58 UTC 2018


Hello!

On Fri, Nov 09, 2018 at 09:11:45AM -0500, kseleznyov wrote:

> Ситуация такая: слушаем порт 80 и перекидываем запрос с него на порты 8080 и
> 8081. За каждым из этих портов стоит FCGI-бекэнд. Примерный файл
> конфигурации:
> 
> 
> # настройка upstream - делаем балансировку на два разных порта
> upstream http_stream {
>         server 127.0.0.1:8080;
>         server 127.0.0.1:8081;
> }
> 
> # основная точка входа, нагрузка на которую балансируется между портами 8080
> и 8081
> server {
>         listen 80 default_server;
>         listen [::]:80 default_server;
>         location / {
>             proxy_pass  http://http_stream;
>         }
> }
> 
> # первый бекэнд - пробрасываем на FCGI по Unix Socket
> server {
>         listen 8080 default_server;
>         listen [::]:8080 default_server;
> 
>         server_name _;
> 
>         location / {
>                 fastcgi_pass unix:/home/skostik/sockets/1.sock;
>         }
> }
> 
> # второй бекэнд - пробрасываем на FCGI по Unix Socket
> server {
>         listen 8081 default_server;
>         listen [::]:8081 default_server;
> 
>         server_name _;
> 
>         location / {
>                 fastcgi_pass unix:/home/skostik/sockets/2.sock;
>         }
> }
> 
> 
> Проблема: если бекэнд не отвечает по сокету
> unix:/home/skostik/sockets/1.sock (т.е. nginx не может установить
> соединение), то nginx не делает балансировку (не перекидывает запрос на порт
> 8081), а возвращает ошибку. Можно ли настроить систему так, чтобы: если один
> бекэнд недоступен, то нужно слать исходный HTTP-запрос на другой порт.

А зачем в этой конструкции "бэкенды", которые не делают ничего 
полезного?  Добавьте оба unix-сокета в один upstream и сделайте на 
него fastcgi_pass прямо из основного сервера - и всё будет 
работать без дополнительных настроек.

Если очень хочется, чтобы nginx видел ошибки работы с 
fastcgi-бэкендами именно в такой конструкции - то вам нужно в 
proxy_next_upstream добавить http_502 и http_504, подробнее в 
документации тут:

http://nginx.org/ru/docs/http/ngx_http_proxy_module.html#proxy_next_upstream

-- 
Maxim Dounin
http://mdounin.ru/


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