Я использую 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;
}
}
Но с этой конфигурацией, когда один из двух внутренних серверов не работает, nginx все еще направляет на него запрос, и это приводит к таймауту в половине случаев :(
Есть ли какое-нибудь решение, чтобы nginx автоматически перенаправлял запрос на другой сервер при обнаружении сбойного сервера.
Спасибо.
Я думаю, это потому, что 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#server
Обычно при обнаружении сбоя серверная часть будет помечена как неработающая в течение x секунд и попытается снова. Так что, если вы продолжаете видеть соединения, вероятно, nginx продолжает проверять, стал ли бэкэнд доступным.
Однако следует попробовать следующую запись в восходящем блоке, поэтому вы не должны фактически видеть, что серверные ВМ недоступны, если только одна из них не работает.