HAProxy: cannot bind socket и плавающий адрес
HAProxy часто слушает плавающий адрес кластера, который поднят только на активном узле. На пассивном узле привязка не проходит, и служба не запускается — пока не разрешена привязка к отсутствующему адресу.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Адрес не поднят на этом узле
Плавающий адрес принадлежит активному узлу. На пассивном его нет, и обычная привязка невозможна.
-
Адрес занят другой службой
Порт 80 или 443 может держать веб-сервер, установленный на том же узле.
-
Ошибка в конфигурации адреса
Опечатка в адресе или порту приводит к попытке привязки к несуществующему адресу.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Проверка конфигурации с указанием строки.
sudo haproxy -c -f /etc/haproxy/haproxy.cfgАдреса узла и разрешение привязки к отсутствующему адресу.
ip -brief addr && sysctl net.ipv4.ip_nonlocal_bindСообщение о неудачной привязке.
journalctl -u haproxy -n 30 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Плавающий адрес принадлежит активному узлу. На пассивном его нет, и обычная привязка невозможна.
- Как проверить
-
Посмотрите адреса и настройку ядра.
ip -brief addr sysctl net.ipv4.ip_nonlocal_bind
- Как исправить
-
Разрешите привязку к отсутствующему адресу — это стандартное решение для балансировщиков.
echo "net.ipv4.ip_nonlocal_bind = 1" | sudo tee /etc/sysctl.d/99-haproxy.conf && sudo sysctl --system
- Почему происходит
- Порт 80 или 443 может держать веб-сервер, установленный на том же узле.
- Как проверить
-
Посмотрите владельца порта.
sudo ss -tlnp | grep -E ":(80|443)\s"
- Как исправить
- Освободите порт: балансировщик и веб-сервер на одном порту не сосуществуют.
- Почему происходит
- Опечатка в адресе или порту приводит к попытке привязки к несуществующему адресу.
- Как проверить
-
Проверьте конфигурацию.
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
- Как исправить
- Исправьте адрес по сообщению проверки.
Пример вывода
Плавающий адрес не поднят на этом узле. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× haproxy.service - HAProxy Load Balancer
Active: failed (Result: exit-code) since Mon 2026-09-15 18:02:41 MSK; 1s ago
haproxy[4700]: [ALERT] Starting frontend https: cannot bind socket [203.0.113.10:443]
systemd[1]: haproxy.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- HAProxy: все серверы группы недоступны Балансировщик отдаёт 503: проверки состояния не проходят. Разбор проверок и таймаутов.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Connection reset by peer в журнале службы Соединение сброшено другой стороной: обрыв клиента, перезапуск сервера, промежуточное устройство.
Где встречается чаще всего
Источники
- Документация HAProxy: привязка адресов
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на узле без плавающего адреса при ip_nonlocal_bind=0.