HAProxy: все серверы группы недоступны
Ошибка 503 от балансировщика означает, что ни один сервер группы не прошёл проверку. Сам HAProxy при этом работает — разбираться надо с серверами и с настройками проверок.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Серверы действительно недоступны
Проверки честно показывают, что приложения не отвечают. Балансировщик защищает клиентов от отправки запросов в пустоту.
-
Проверка настроена не на тот путь
Проверка по адресу, который отвечает ошибкой или требует аутентификации, всегда будет неуспешной при работающем приложении.
-
Таймаут проверки слишком короткий
Медленно отвечающее приложение не укладывается в таймаут, и сервер помечается недоступным при формально работающем приложении.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Состояние всех серверов группы.
echo "show stat" | sudo socat stdio /run/haproxy/admin.sock | cut -d, -f1,2,18 | head -20История изменений состояния серверов.
journalctl -u haproxy -n 40 --no-pager | grep -iE "is DOWN|is UP"Проверка конфигурации.
sudo haproxy -c -f /etc/haproxy/haproxy.cfgРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Проверки честно показывают, что приложения не отвечают. Балансировщик защищает клиентов от отправки запросов в пустоту.
- Как проверить
-
Посмотрите состояние серверов в статистике.
echo "show stat" | sudo socat stdio /run/haproxy/admin.sock 2>/dev/null | cut -d, -f1,2,18 | head journalctl -u haproxy -n 30 --no-pager | grep -i "is DOWN"
- Как исправить
- Разбирайтесь с приложениями. Балансировщик вернёт серверы в работу сам, как только проверки начнут проходить.
- Почему происходит
- Проверка по адресу, который отвечает ошибкой или требует аутентификации, всегда будет неуспешной при работающем приложении.
- Как проверить
-
Посмотрите описание проверки и проверьте путь вручную.
sudo grep -A3 -i "option httpchk" /etc/haproxy/haproxy.cfg curl -sI http://сервер:8080/health | head -3
- Как исправить
- Настройте проверку на отдельный путь состояния, который отвечает без аутентификации и не зависит от базы.
- Почему происходит
- Медленно отвечающее приложение не укладывается в таймаут, и сервер помечается недоступным при формально работающем приложении.
- Как проверить
-
Посмотрите таймауты проверок.
sudo grep -iE "timeout (check|connect)" /etc/haproxy/haproxy.cfg
- Как исправить
- Увеличьте таймаут проверки до времени, за которое приложение отвечает под нагрузкой, с запасом.
Пример вывода
Все серверы группы помечены недоступными. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
haproxy[1200]: Server backend/web1 is DOWN, reason: Layer7 wrong status, code: 503, check duration: 12ms. 1 active and 0 backup servers left.
haproxy[1200]: backend backend has no server available!
Связанные ошибки
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- HAProxy: cannot bind socket и плавающий адрес HAProxy не запускается на пассивном узле кластера: адрес не поднят. Параметр ip_nonlocal_bind.
- nginx 502 Bad Gateway: connect() failed к приложению nginx работает, а приложение недоступно: connect() failed, connection refused, no such file or directory для сокета. Разбор 502.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Connection reset by peer в журнале службы Соединение сброшено другой стороной: обрыв клиента, перезапуск сервера, промежуточное устройство.
Где встречается чаще всего
Источники
- Документация HAProxy: проверки состояния
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено остановкой всех серверов группы в тестовой схеме.