Вики / Службы и systemd
HAProxy (балансировщик)
Балансировка нагрузки и проксирование TCP/HTTP — бэкенды, health-check, статистика.
HAProxy распределяет соединения между несколькими бэкендами (серверами) и проверяет их здоровье. Работает на L4 (TCP) и L7 (HTTP). Часто стоит перед пулом веб-серверов (nginx) или БД.
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
haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl reload haproxy # graceful, без обрыва
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 (без рестарта — вывести сервер из ротации):
echo "disable server servers/s1" | sudo socat stdio /run/haproxy/admin.sock
echo "show stat" | sudo socat stdio /run/haproxy/admin.sock
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 на бэкенде.
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
См. также
- ss (сокеты и порты) — Сеть
- nginx — Службы и systemd
- keepalived (VRRP, плавающий IP) — Службы и systemd