HAProxy: балансировка и health checks
HAProxy vs Nginx
HAProxy специализируется на балансировке нагрузки и reverse proxy. В отличие от Nginx, он поддерживает протоколы уровня L4 (TCP/UDP) и имеет более развитую систему health checks. HAProxy — стандарт де-факто для высоконагруженных проектов: он обслуживает запросы Facebook, GitHub, Stack Overflow.
Установка
# Ubuntu/Debian
sudo apt install haproxy
# Проверка версии
haproxy -v
# Структура конфигурации
# /etc/haproxy/haproxy.cfg
Базовая конфигурация
global
log /dev/log local0
log /dev/log local1 notice
maxconn 50000
user haproxy
group haproxy
daemon
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
retries 3
frontend http_front
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/
redirect scheme https code 301 if !{ ssl_fc }
default_backend web_servers
backend web_servers
balance roundrobin
option httpchk GET /health
http-check expect status 200
server web1 10.0.0.1:3000 check inter 5s fall 3 rise 2
server web2 10.0.0.2:3000 check inter 5s fall 3 rise 2
server web3 10.0.0.3:3000 check inter 5s fall 3 rise 2
Health checks
HAProxy поддерживает несколько типов проверок состояния:
# TCP check (L4) — просто проверка порта
server app1 10.0.0.1:3000 check
# HTTP check с ожидаемым кодом
server app1 10.0.0.1:3000 check httpchk GET /status
http-check expect status 200
# HTTP check с проверкой содержимого
http-check expect rstatus ^2
http-check send-hdr Content-Type:\ application/json
# Проверка SSL-сертификата
server app1 10.0.0.1:443 check ssl verify none
# Интервалы проверок
server app1 10.0.0.1:3000 check inter 3s fastinter 1s downinter 10s
# inter — интервал когда сервер UP
# fastinter — интервал при смене состояния
# downinter — интервал когда сервер DOWN
Балансировка
# Round-robin (по умолчанию)
balance roundrobin
# Least connections
balance leastconn
# Source IP hash
balance source
# URI hash (для кэширующих бэкендов)
balance uri
# HTTP header hash
balance hdr(X-User-ID)
# Вес серверов
server app1 10.0.0.1:3000 weight 3 check
server app2 10.0.0.2:3000 weight 1 check
Stick таблицы
Stick tables позволяют привязать клиента к серверу на основе various параметров:
backend web_servers
balance roundrobin
stick-table type ip size 200k expire 30s
stick on src
server app1 10.0.0.1:3000 check
server app2 10.0.0.2:3000 check
Stick tables хранятся в памяти HAProxy. При большом количестве клиентов следите за размером таблицы.
Rate limiting
frontend http_front
bind *:80
# Лимит 100 запросов в минуту на IP
stick-table type ip size 100k expire 60s store http_req_rate(10s)
http-request track-sc0 src
http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }
Stats интерфейс
listen stats
bind *:8404
stats enable
stats uri /stats
stats refresh 10s
stats admin if TRUE
stats auth admin:your_password_here
Веб-интерфейс покажет: количество соединений, ошибки, время ответа, состояние каждого backend-сервера. Через него можно вручную выключить/включить сервер.
Логирование
# /etc/rsyslog.d/haproxy.conf
$AddUnixListenSocket /var/lib/haproxy/dev/log
local0.* /var/log/haproxy/access.log
local1.* /var/log/haproxy/error.log
# custom log format
frontend http_front
log global
log-format "%ci:%cp [%t] %ft %b/%s %Tw/%Tc/%Tt %B %ts[0] %hr %[hrl] %{+Q}r"
Вывод
HAProxy — это зрелый и надежный балансировщик с развитой системой health checks. Он подходит для сценариев, где критична высокая доступность и детальный мониторинг. Комбинируйте с Prometheus и Grafana для полной картины состояния инфраструктуры.