Назад | Перейти на главную страницу

Отказоустойчивость Nginx с восходящим балансировщиком нагрузки не работает, 504, когда сервер 1 не работает

У меня есть докер-контейнер nginx balancer который действует как балансировщик для 3 контейнеров докеров nginx server_1, server_2, server_3.

Балансировка нагрузки работает нормально, она воздействует на все серверы в зависимости от указанного метода. Однако, когда я останавливаю первый сервер, используя docker stop server_1, Я получаю 504, даже если другие серверы все еще работают.

Мой файл балансировщика по умолчанию выглядит так:

# don't redirect proxy
proxy_redirect  off;

upstream app {
    least_conn;
    server webserver_1;
    server webserver_2;
    server webserver_3;
}

server {
    listen 80;
    location / {
        proxy_pass http://app;
        proxy_next_upstream error timeout invalid_header http_500 http_504;
        # proxy_set_header Host localhost;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Я пробовал добавить fail_timeout=10s max_fails=1 к трем серверам в upstream директива, но не повезло. Я также попытался добавить proxy_next_upstream_tries 2; директиву, но это тоже не помогло.

Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация.

Я испытал то, что он просто использует все 3 сервера в соответствии с методом балансировки нагрузки, но не отмечает сервер как неработающий.

Какой тип сети докеров вы используете? Интересно, почему тайм-аут запросов. Какие-нибудь правила брандмауэра?

Для балансировки нагрузки обычно плохо «полагаться» на таймауты. Лучше, когда хост (контейнер) становится недоступным (что-то вроде «нет маршрута к хосту») или соединение сбрасывается (контейнер доступен, но служба не работает).