NPV-AM

← Все статьи

HAProxy: балансировка и health checks

3 апр 2026 · 11 мин чтения

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 для полной картины состояния инфраструктуры.