У меня есть докер-контейнер 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 сервера в соответствии с методом балансировки нагрузки, но не отмечает сервер как неработающий.
Какой тип сети докеров вы используете? Интересно, почему тайм-аут запросов. Какие-нибудь правила брандмауэра?
Для балансировки нагрузки обычно плохо «полагаться» на таймауты. Лучше, когда хост (контейнер) становится недоступным (что-то вроде «нет маршрута к хосту») или соединение сбрасывается (контейнер доступен, но служба не работает).