Автоматическое распределение нагрузки при отказе nginx

29

Я использую nginx и NginxHttpUpstreamModule для балансировки нагрузки. Мой конфиг очень прост:

upstream lb {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

server {
    listen  89;
    server_name localhost;

    location / {
            proxy_pass      http://lb;
            proxy_redirect  off;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Но с этим конфигом, когда один из 2 серверных серверов не работает, nginx все еще направляет запрос к нему, и это приводит к тайм-ауту в половине случаев :(

Есть ли какое-нибудь решение сделать nginx для автоматической маршрутизации запроса на другой сервер, когда он обнаружит сбитый сервер.

Спасибо.

robinmag
источник

Ответы:

33

Я думаю, что это потому, что nginx не обнаруживает, что восходящий поток не работает, потому что он находится на той же машине.

Варианты, которые вы ищете: proxy_next_upstream и proxy_connect_timeout .

Попробуй это:

location / {
        proxy_pass              http://lb;
        proxy_redirect          off;
        proxy_next_upstream     error timeout invalid_header http_500;
        proxy_connect_timeout   2;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
}
Гийом Филион
источник
У меня были проблемы с неполной установкой Apache / PHP (отсутствующие файлы библиотеки PEAR), которая вызвала ошибки http 500. proxy_next_upstream только что повторил попытку на другом компьютере - это вернуло OK.
Алистер Булман
5
Почему proxy_redirect отключен?
Сеун Осева
2

Эй, пожалуйста, смотрите вики: http://wiki.nginx.org/NginxHttpUpstreamModule#server

В основном, если обнаружен сбой, бэкэнд будет помечен как выключенный в течение x секунд, и он попытается снова. Так что, если вы продолжаете видеть соединения, вероятно, nginx продолжает проверять, стал ли бэкэнд доступным.

Однако следует попробовать следующую запись в вышестоящем блоке, поэтому вы не должны видеть, что бэкэнды не доступны, если только один не работает.

Мартин Фьордвальд
источник