Что такое HAProxy и как настроить простой балансировщик нагрузки

8 минут чтения
Средний рейтинг статьи — 4.9

HAProxy (High Availability Proxy) — это высокопроизводительный прокси-сервер и балансировщик нагрузки для TCP и HTTP-трафика.
Он позволяет распределять запросы пользователей между несколькими серверами-бэкендами, чтобы:

  • увеличить доступность (если один сервер «падает», трафик уходит на другие),
  • масштабировать нагрузку при росте числа пользователей,
  • гибко управлять маршрутизацией запросов.

HAProxy используют крупные проекты — GitHub, Reddit, Airbnb — благодаря его скорости, надёжности и богатому функционалу.

Основные режимы работы

  • Layer 4 (TCP) — прозрачная проксификация на уровне транспортного протокола: полезно для баз данных, SMTP, любых TCP-служб.
  • Layer 7 (HTTP) — работа с HTTP-заголовками, возможность роутинга по URI, доменам, cookies.

Установка HAProxy

Debian/Ubuntu

sudo apt update
sudo apt install haproxy

CentOS/RHEL

sudo yum install haproxy

Проверяем:

haproxy -v

Базовая архитектура

HAProxy в конфиге делится на секции:

  • global – общие параметры (логи, количество процессов и пр.).
  • defaults – настройки по умолчанию для всех фронтендов и бэкендов.
  • frontend – «лицо» балансировщика, куда приходит трафик от клиентов.
  • backend – список серверов, на которые распределяется трафик.

Пример: балансировка HTTP между двумя серверами

Создадим простой конфиг /etc/haproxy/haproxy.cfg:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    daemon
 
defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000
 
frontend http_front
    bind *:80
    default_backend http_back
 
backend http_back
    balance roundrobin
    server web1 192.168.1.10:80 check
    server web2 192.168.1.11:80 check
  • roundrobin — запросы равномерно идут то на web1, то на web2.
  • check — периодическая проверка доступности бэкенда.

Перезапускаем сервис:

sudo systemctl restart haproxy
sudo systemctl enable haproxy

Теперь трафик на порт 80 хоста с HAProxy будет автоматически распределяться на два указанных сервера.

Другие алгоритмы балансировки

  • leastconn – отправляет запросы на сервер с наименьшим числом активных соединений.
  • source – «липкие» сессии: один IP-клиент всегда попадает на один и тот же бэкенд.
  • uri / hdr / cookie – балансировка на основе URI, заголовков или cookies.

Настройка страницы статистики

HAProxy умеет показывать удобную веб-страницу с текущими метриками.
Добавим в конфиг:

listen stats
    bind *:8080
    stats enable
    stats uri /stats
    stats auth admin:strongpass

После перезапуска откройте http://<haproxy-host>:8080/stats и войдите с логином/паролем.

SSL/TLS

HAProxy может терминировать HTTPS-трафик:

frontend https_front
    bind *:443 ssl crt /etc/haproxy/certs/example.pem
    default_backend http_back

Где example.pem — объединённый сертификат и приватный ключ.
Это удобно: бэкенды могут оставаться на чистом HTTP, а шифрование выполняется на уровне HAProxy.

Логи и мониторинг

  • Логи по умолчанию идут в rsyslog (/var/log/haproxy.log в зависимости от дистрибутива).
  • Для долгосрочного мониторинга часто используют Prometheus-экспортеры или встроенный socket API HAProxy.

Продвинутое использование

Health-checks и опции проверок

В примере мы использовали просто check, но HAProxy умеет гибко проверять бэкенды:

server web1 192.168.1.10:80 check inter 5s rise 2 fall 3
  • inter 5s — проверка каждые 5 секунд.
  • rise 2 — сервер считается «здоровым», если успешно ответил 2 раза подряд.
  • fall 3 — считается «павшим» после 3 неудачных проверок.

Это помогает избегать ложных срабатываний при кратковременных сбоях.

Sticky sessions (привязка клиента к серверу)

Если веб-приложению нужна «сессия» на одном бэкенде (например, хранение корзины в памяти), добавляют cookie:

backend http_back
    balance roundrobin
    cookie SERVERID insert indirect nocache
    server web1 192.168.1.10:80 check cookie s1
    server web2 192.168.1.11:80 check cookie s2

Теперь клиент, получив cookie SERVERID, будет направляться на тот же сервер.

Продвинутая маршрутизация

В режиме L7 можно направлять трафик по доменам или путям:

frontend http_front
    bind *:80
    acl blog_path path_beg /blog
    use_backend blog_back if blog_path
    default_backend site_back

Это позволяет, например, выделить отдельный бэкенд под блог или API.

Практические рекомендации

  • Разносите HAProxy и бэкенды на разные узлы при высоких нагрузках.
  • Для высокой доступности (high availability) используйте два балансировщика в связке с Keepalived или аналогом.
  • Следите за обновлениями: новые версии HAProxy приносят серьёзные улучшения производительности.

Заключение

HAProxy — зрелое, быстрое и очень гибкое решение для балансировки нагрузки.
С минимальной конфигурацией можно распределять HTTP-трафик между несколькими серверами, а при необходимости добавлять SSL-терминацию, подробную статистику, различные алгоритмы балансировки и высокодоступные кластеры.

8 минут чтения
Средний рейтинг статьи — 4.9

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний