Автоматическое распределение нагрузки при отказе nginx
Я использую 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 для автоматической маршрутизации запроса на другой сервер, когда он обнаружит сбитый сервер.
Спасибо.
2 ответа
Я думаю, что это потому, что 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;
}
Эй, пожалуйста, смотрите вики: http://wiki.nginx.org/NginxHttpUpstreamModule
В основном, если обнаружен сбой, бэкэнд будет помечен как выключенный в течение x секунд, и он попытается снова. Так что, если вы продолжаете видеть соединения, вероятно, nginx продолжает проверять, стал ли бэкэнд доступным.
Однако следует попробовать следующую запись в вышестоящем блоке, поэтому вы не должны видеть, что бэкэнды не доступны, если только один не работает.