Установка на Debian/Ubuntu, Docker-контейнер, базовая конфигурация, проверка работы
Правильная установка — фундамент стабильной работы. Рассмотрим все способы: от apt до Docker.
# Добавляем репозиторий HAProxy (актуальная версия)
sudo add-apt-repository ppa:vbernat/haproxy-2.8
sudo apt update
# Устанавливаем HAProxy
sudo apt install haproxy
# Проверяем версию
haproxy -vВывод:
HAProxy version 2.8.5-1ubuntu1~jammy 2024/01/20
Copyright 2000-2024 Willy Tarreau <willy@haproxy.org>
Структура после установки:
/etc/haproxy/
├── haproxy.cfg # Основной конфиг
├── certs/ # SSL сертификаты
└── errors/ # Кастомные страницы ошибок
/var/log/haproxy/ # Логи (если настроены)
/var/run/haproxy/ # PID файл, stats socket
docker run -d \
--name haproxy \
-p 80:80 \
-p 443:443 \
-p 8404:8404 \
-v $(pwd)/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro \
-v $(pwd)/certs:/etc/haproxy/certs:ro \
haproxy:2.8Проверка:
docker logs haproxy
docker exec haproxy haproxy -c -f /usr/local/etc/haproxy/haproxy.cfg# Добавляем репозиторий
helm repo add haproxy https://haproxy-ingress.github.io/charts/haproxy-ingress
helm repo update
# Устанавливаем
helm install haproxy-ingress haproxy/haproxy-ingress \
--namespace ingress-nginx \
--create-namespaceСоздадим минимальную конфигурацию для балансировки HTTP трафика между двумя веб-серверами.
global
log /dev/log local0
maxconn 4096
daemon
defaults
log global
mode http
option httplog
timeout connect 5s
timeout client 30s
timeout server 30s
frontend http_front
bind *:80
default_backend web_servers
backend web_servers
balance roundrobin
server web1 192.168.1.10:8080 check
server web2 192.168.1.11:8080 checkglobal — настройки всего процесса HAProxy:
log /dev/log local0 — отправка логов в syslogmaxconn 4096 — максимум соединений для всего процессаdaemon — запуск в фоновом режимеdefaults — настройки по умолчанию для всех frontend/backend:
mode http — HTTP режим (Layer 7)timeout connect 5s — время на установку соединения с backendtimeout client 30s — время ожидания клиентаtimeout server 30s — время ожидания ответа от backendfrontend — точка входа для клиентов:
bind *:80 — слушать порт 80 на всех интерфейсахdefault_backend web_servers — направлять все запросы на этот backendbackend — пул серверов:
balance roundrobin — циклическое распределениеserver web1 ... check — сервер с health checkПеред запуском всегда проверяйте синтаксис:
# Проверка синтаксиса
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
# Вывод при успехе:
# Configuration file is validЧастые ошибки:
[ALERT] (12345) : parsing [/etc/haproxy/haproxy.cfg:15] :
error detected while parsing an 'option httpchk' directive :
missing HTTP method or URI.
Исправление:
# Неправильно:
option httpchk
# Правильно:
option httpchk GET /health# Старт
sudo systemctl start haproxy
# Перезапуск (полный)
sudo systemctl restart haproxy
# Reload (мягкий, zero-downtime)
sudo systemctl reload haproxy
# Статус
sudo systemctl status haproxy
# Включить автозагрузку
sudo systemctl enable haproxy# Перезапуск контейнера
docker restart haproxy
# Reload конфигурации (если примонтирован конфиг)
docker kill -s HUP haproxy# Запрос к HAProxy
curl -v http://localhost/
# Ожидаемый ответ:
# < HTTP/1.1 200 OK
# < server: HAProxy/2.8.5# Статус серверов через stats socket
echo "show servers state" | sudo socat /var/run/haproxy/admin.sock stdio
# Вывод:
# 0:web1(192.168.1.10:8080) UP
# 0:web2(192.168.1.11:8080) UPДобавим встроенную страницу статистики:
listen stats
bind *:8404
stats enable
stats uri /
stats refresh 5s
stats admin if LOCALHOSTОткрываем в браузере: http://your-server:8404/
Что показывает stats страница:
Создадим /etc/rsyslog.d/49-haproxy.conf:
# HAProxy логи
local0.* /var/log/haproxy.log
# Отключаем дублирование в syslog
& stop
Перезапуск rsyslog:
sudo systemctl restart rsyslogПросмотр логов:
tail -f /var/log/haproxy.logПример лога:
Jan 15 10:23:45 haproxy[1234]: 192.168.1.100:54321 [15/Jan/2024:10:23:45.123]
http_front web_servers/web1 0/0/1/15/16 200 1234 - - ---- 1/1/0/0/0 0/0 "GET /api/users HTTP/1.1"
Формат лога:
192.168.1.100:54321 — клиентhttp_front — frontendweb_servers/web1 — backend/сервер0/0/1/15/16 — тайминги (connect, queue, response, total)200 — статус ответаGET /api/users — запрос# Проверка логов
sudo journalctl -u haproxy -f
# Частая причина: порт уже занят
sudo netstat -tlnp | grep :80# Проверка доступности серверов
curl http://192.168.1.10:8080/health
# Проверка firewall
sudo ufw status
# Проверка логов HAProxy
tail -f /var/log/haproxy.log# Неправильно:
bind 192.168.1.999:80 # несуществующий IP
# Правильно:
bind *:80 # все интерфейсы
# или
bind 192.168.1.10:80 # конкретный IPhaproxy -chaproxy -cИзучим секцию global детально: процессы, логирование, tuning ядра и security limits.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.