Что такое HAProxy и как настроить простой балансировщик нагрузки
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-терминацию, подробную статистику, различные алгоритмы балансировки и высокодоступные кластеры.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний