Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Defaults и логины
defaults_config

Defaults и логины

Секция defaults: таймауты, режимы работы, логины по умолчанию

Defaults и логины HAProxy

Секция defaults задаёт настройки по умолчанию для всех frontend и backend, уменьшая дублирование конфигурации.

#Структура секции defaults

defaults # Наследование логов log global # Режим работы mode http # Опции option httplog option dontlognull option forwardfor # Таймауты timeout connect 5s timeout client 30s timeout server 30s # Retries retries 3

#Логирование

#log global

defaults log global

Назначение: Наследует настройки логирования из секции global.

Альтернатива — переопределение:

defaults log 127.0.0.1:514 local1 warning

Когда переопределять:

  • Разные логи для разных типов трафика
  • Отдельный лог для ошибок (warning+)
  • Тестирование без засорения основных логов

#option httplog

defaults option httplog

Назначение: Включает детальное HTTP логирование.

Формат лога:

192.168.1.100:54321 [15/Jan/2024:10:23:45.123] 
  frontend backend/server 0/0/1/15/16 200 1234 
  - - ---- 1/1/0/0/0 0/0 "GET /api/users HTTP/1.1"

Без httplog (TCP mode):

192.168.1.100:54321 [15/Jan/2024:10:23:45.123] 
  frontend backend/server 0/0/1/15/16 200 1234

#option dontlognull

defaults option dontlognull

Назначение: Не логировать соединения без запросов (health checks, сканеры).

Проблема без dontlognull:

- - - - 0/0/0/0/0 408 0 - - ---- 0/0/0/0/0 0/0 ""

Зачем:

  • Уменьшает размер логов на 30-50%
  • Убирает «шум» от health checks
  • Упрощает анализ реального трафика

#option forwardfor

defaults option forwardfor

Назначение: Добавляет заголовок X-Forwarded-For с IP клиента.

Пример:

# Клиент 203.0.113.50 → HAProxy → Backend
X-Forwarded-For: 203.0.113.50

Варианты:

# С указанием порта option forwardfor addr header X-Forwarded-For # Если заголовок уже есть — не добавлять option forwardfor if-none # Полная цепочка прокси option forwardfor except 127.0.0.0/8

Важно для backend:

  • Backend должен доверять X-Forwarded-For
  • Логи backend будут показывать реальный IP клиента

#Режимы работы

#mode http

defaults mode http

Возможности:

  • Анализ HTTP заголовков, path, method
  • ACL на основе HTTP параметров
  • Модификация запросов/ответов
  • Cookie-based сессии
  • HTTP health checks

Производительность:

  • Немного выше overhead чем TCP mode
  • Для чистого TCP трафика (БД) используйте mode tcp

#mode tcp

defaults mode tcp

Применение:

  • Балансировка баз данных (MySQL, PostgreSQL)
  • Redis, MongoDB, Memcached
  • Кастомные бинарные протоколы
  • SSH, SMTP, IMAP

Ограничения:

  • Нет анализа HTTP
  • Нет модификации заголовков
  • Только L4 балансировка

#mode health

defaults mode health

Назначение: Специальный режим для health checks.

Использование:

listen health bind *:9999 mode health server haproxy 127.0.0.1 check

Проверка:

curl http://localhost:9999 # HTTP 200 — HAProxy здоров

#Таймауты

#timeout connect

defaults timeout connect 5s

Назначение: Время на установку TCP соединения с backend.

Что происходит при превышении:

  • HAProxy возвращает 503 Service Unavailable
  • В логе: connection timeout
  • Соединение не засчитывается в retry (если не настроено)

Рекомендации:

  • 3-5s для локальной сети
  • 10s для cross-region backend
  • Увеличьте для «медленных» сервисов

#timeout client

defaults timeout client 30s

Назначение: Максимальное время ожидания данных от клиента.

Сценарии:

  • Клиент медленно отправляет request body
  • Клиент не читает response (slow client)
  • WebSocket соединения (требуется отдельная настройка)

Проблемы:

  • Слишком маленький — обрыв медленных клиентов
  • Слишком большой — накопление idle соединений

#timeout server

defaults timeout server 30s

Назначение: Максимальное время ожидания ответа от backend.

Что происходит при превышении:

  • HAProxy возвращает 504 Gateway Timeout
  • Соединение с backend закрывается
  • Клиент получает ошибку

Рекомендации:

  • Должен быть больше времени ответа backend (p95)
  • Для долгих операций (export, report) — увеличьте или используйте отдельный backend

#timeout http-request

defaults timeout http-request 10s

Назначение: Время на получение полного HTTP запроса от клиента.

Защищает от:

  • Slowloris атак (медленная отправка заголовков)
  • «Зомби» соединений (клиент не отправляет запрос)

Рекомендации:

  • 5-10s достаточно для большинства случаев
  • Увеличьте для больших file upload

#timeout http-keep-alive

defaults timeout http-keep-alive 5s

Назначение: Время ожидания следующего запроса на keep-alive соединении.

Keep-alive:

  • Клиент: Connection: keep-alive
  • Одно TCP соединение для нескольких запросов
  • Уменьшает latency (нет TCP handshake)

Рекомендации:

  • 2-5s — баланс между reuse и ресурсами
  • Слишком долгий — накопление idle соединений

#timeout queue

defaults timeout queue 30s

Назначение: Время ожидания в очереди, если все серверы busy.

Когда используется:

  • Все серверы достигли maxconn
  • Новые запросы становятся в очередь
  • Если очередь заполнена — 503 Service Unavailable

Пример:

backend web_servers balance roundrobin maxconn 100 per server server web1 192.168.1.10:8080 maxconn 100 server web2 192.168.1.11:8080 maxconn 100

#Retries

#retries

defaults retries 3

Назначение: Количество попыток подключения к backend при ошибке.

Когда retry:

  • Connection refused
  • Connection timeout
  • Server closed connection

Поведение:

  • Каждая попытка — к следующему серверу в backend
  • После retries попыток — ошибка клиенту

Рекомендации:

  • 2-3 для локальной сети
  • 1 для идемпотентных запросов (GET)
  • 0 для неидемпотентных (POST, PUT) — чтобы не дублировать

#option redispatch

defaults option redispatch

Назначение: Разрешает переключение на другой сервер после неудачи.

Пример:

Запрос → Server 1 (fail) → Server 2 (success)

Без redispatch:

  • Запрос остаётся на неудачном сервере
  • Клиент получает ошибку

С redispatch:

  • HAProxy пробует другие серверы
  • Увеличивает шанс успеха

#Полная секция defaults для production

defaults # Логирование log global option httplog option dontlognull # Режим mode http # Таймауты timeout connect 5s timeout client 30s timeout server 30s timeout http-request 10s timeout http-keep-alive 5s timeout queue 30s # Опции option forwardfor option redispatch retries 3

#Таймауты для WebSocket

WebSocket требует особых настроек:

defaults timeout tunnel 1h # Для WebSocket туннелей frontend ws_front bind *:80 acl is_websocket hdr(Upgrade) -i websocket use_backend ws_servers if is_websocket backend ws_servers timeout server 1h timeout tunnel 1h server ws1 192.168.1.10:8080 check

timeout tunnel:

  • Применяется к соединениям без активности (туннели)
  • WebSocket, SSH, long polling

#Диагностика таймаутов

#Логи таймаутов

# Connect timeout
backend web_servers: no server available for connection

# Client timeout
client timeout: 30s expired waiting for client data

# Server timeout
server timeout: 30s expired waiting for server response

#Stats страница

На stats странице смотрите:

  • ReqRate — запросов в секунду
  • ConnRate — соединений в секунду
  • RespTime — время ответа (avg, min, max)
  • Wredis — запросов в очереди

Далее: Frontend и Bind