С чего начать Первые шаги трек · 15 ступеней
Linux Labs

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

3 мин Ubuntu 24.04 · HAProxy 2.x

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

Шпаргалка

3 команды Версия для печати
  • 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

Обзор

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

bash
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
bash
haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl reload haproxy          # graceful, без обрыва

Рецепты

1

Балансировка и маршрутизация

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 (без рестарта — вывести сервер из ротации):

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

Неполадки

5

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 на бэкенде.

См. также

  • nginx — Веб-сервер и обратный прокси. Конфиг проверяется nginx -t; reload без даунтайма.
  • keepalived — Высокая доступность через виртуальный IP — failover между узлами по VRRP.
  • ss — Кто слушает порты и какие соединения открыты — современная замена netstat.
Загрузка…