linux-labs

Вики / Службы и systemd

HAProxy (балансировщик)

Сервис Ubuntu 24.04 · HAProxy 2.x СлужбыСетьВеб

Балансировка нагрузки и проксирование TCP/HTTP — бэкенды, health-check, статистика.

HAProxy распределяет соединения между несколькими бэкендами (серверами) и проверяет их здоровье. Работает на L4 (TCP) и L7 (HTTP). Часто стоит перед пулом веб-серверов (nginx) или БД.

systemctl status haproxy
haproxy -c -f /etc/haproxy/haproxy.cfg    # проверить конфиг ПЕРЕД reload

/etc/haproxy/haproxy.cfg (frontend принимает, backend раздаёт):

frontend web
    bind *:80
    bind *:443 ssl crt /etc/haproxy/site.pem      # TLS-терминация
    http-request redirect scheme https unless { ssl_fc }
    default_backend servers

backend servers
    balance roundrobin                 # или leastconn / source (sticky по IP)
    option httpchk GET /health         # health-check L7
    option forwardfor                  # X-Forwarded-For (реальный IP клиента)
    cookie SRV insert indirect nocache # session stickiness по cookie
    server s1 10.0.0.11:8000 check cookie s1
    server s2 10.0.0.12:8000 check cookie s2 backup   # резервный

listen stats                           # страница статистики
    bind *:8404
    stats enable
    stats uri /stats
haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl reload haproxy          # graceful, без обрыва
balance Когда
roundrobin равномерно по очереди (дефолт)
leastconn на наименее загруженный (долгие сессии, БД)
source sticky по IP клиента

Маршрут по пути/хосту через ACL:

frontend web
    acl is_api path_beg /api
    use_backend api_servers if is_api
    default_backend web_servers

Runtime API (без рестарта — вывести сервер из ротации):

echo "disable server servers/s1" | sudo socat stdio /run/haproxy/admin.sock
echo "show stat" | sudo socat stdio /run/haproxy/admin.sock

503 Service Unavailable

Нет «живых» бэкендов: health-check провалился у всех server. Открой :8404/stats — видно UP/DOWN каждого. Проверь, что бэкенд отвечает: curl http://10.0.0.11:8000/health.

Все запросы идут на один сервер

balance не задан или включена cookie/source-липкость. Проверь секцию backend.

Не применяется конфиг

haproxy -c -f ... покажет ошибку (строку). reload (graceful) вместо restart, чтобы не рвать соединения.

Не вижу реальный IP клиента на бэкенде

Добавь option forwardfor и читай X-Forwarded-For на бэкенде/nginx (real_ip). Для TLS-проброса без терминации — режим tcp + send-proxy.

Таймауты / обрывы под нагрузкой

Настрой timeout connect/client/server в defaults и maxconn. Слишком малые server-timeout рвут долгие ответы; смотри ss на бэкенде.

haproxy -c -f /etc/haproxy/haproxy.cfg     # проверить конфиг
sudo systemctl reload haproxy              # применить (graceful)
# :8404/stats — UP/DOWN бэкендов
# frontend bind (ssl crt) → backend: balance + server ... check + option httpchk/forwardfor
echo "show stat" | sudo socat stdio /run/haproxy/admin.sock   # runtime

См. также