Слушатели, протоколы HTTP/TCP, SSL termination на уровне frontend
Секция
frontendопределяет как HAProxy принимает входящие соединения: IP, порт, SSL, маршрутизация.
frontend http_front
bind *:80
default_backend web_serversМинимальная конфигурация:
bind *:80 — слушать порт 80 на всех интерфейсахdefault_backend web_servers — направлять все запросы на этот backend# Все интерфейсы, порт 80
bind *:80
# Конкретный IP
bind 192.168.1.10:80
# Несколько портов
bind *:80,*:443
# Unix socket
bind /var/run/haproxy.sock# SSL с одним сертификатом
bind *:443 ssl crt /etc/haproxy/certs/site.pem
# SSL с несколькими сертификатами (SNI)
bind *:443 ssl crt /etc/haproxy/certs/
# SSL с параметрами
bind *:443 ssl crt /etc/haproxy/certs/site.pem \
alpn h2,http/1.1 \
ssl-min-ver TLSv1.2 \
no-tls-ticketsПараметры:
ssl — включает SSL terminationcrt — путь к сертификату (PEM) или директорииalpn — протоколы (h2 = HTTP/2)ssl-min-ver — минимальная версия TLSno-tls-tickets — отключает session tickets# Приём PROXY protocol от другого балансировщика
bind *:80 accept-proxy
# PROXY protocol v2
bind *:80 accept-proxy protocol v2Когда используется:
Пример:
# Frontend принимает PROXY protocol
frontend http_front
bind *:80 accept-proxy
default_backend web_serversfrontend http_front
bind *:80
default_backend web_servers
frontend https_front
bind *:443 ssl crt /etc/haproxy/certs/site.pem
default_backend web_serversfrontend api_front
bind 192.168.1.10:80
default_backend api_servers
frontend web_front
bind 192.168.1.11:80
default_backend web_serversfrontend h2_front
bind *:443 ssl crt /etc/haproxy/certs/site.pem alpn h2,http/1.1
default_backend web_serversПреимущества HTTP/2:
frontend h2c_front
bind *:8080 alpn h2c,http/1.1
default_backend web_serversВажно: Большинство браузеров требуют TLS для HTTP/2.
frontend http_front
bind *:80
redirect scheme https code 301 if !{ ssl_fc }Параметры:
scheme https — меняет http:// на https://code 301 — постоянное перенаправление (SEO friendly)if !{ ssl_fc } — только если не SSLfrontend old_api
bind *:80
redirect prefix /api/v2 code 301 if { path_beg /api/v1 }Пример:
GET /api/v1/users → 301 → /api/v2/api/v1/users
Правильно (с regexp):
frontend old_api
bind *:80
http-request redirect location /api/v2%[path] if { path_beg /api/v1 }frontend http_front
bind *:80
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.httpФормат errorfile:
HTTP/1.1 503 Service Unavailable
Content-Type: text/html
Connection: close
Retry-After: 10
<html>
<body>
<h1>Service Unavailable</h1>
<p>Please try again later.</p>
</body>
</html>frontend http_front
bind *:80
# Stick table для rate limiting
stick-table type ip size 100k expire 30s store http_req_rate(10s)
# Трекаем IP клиента
http-request track-sc0 src
# Deny если больше 100 запросов за 10 секунд
http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }
default_backend web_serversПараметры stick-table:
type ip — ключ по IPsize 100k — 100,000 записейexpire 30s — запись истекает через 30sstore http_req_rate(10s) — счётчик запросов за 10sfrontend http_front
bind *:80
# Блокировка диапазона
http-request deny if { src 10.0.0.0/8 }
# Блокировка по списку
acl blocked_ips src -f /etc/haproxy/blocked_ips.txt
http-request deny if blocked_ips
default_backend web_serversФормат blocked_ips.txt:
192.168.1.100
10.0.0.0/8
172.16.0.0/12
frontend http_front
bind *:80
# Блокировка сканеров
acl bad_bot hdr_sub(User-Agent) -i scanner
http-request deny if bad_bot
# Блокировка curl/wget
acl cli_tool hdr_sub(User-Agent) -i curl wget
http-request deny if cli_tool
default_backend web_serversfrontend http_front
bind *:80
stick-table type ip size 100k expire 30s store conn_cur
http-request track-sc0 src
http-request deny if { sc_conn_cur(0) gt 10 }
default_backend web_serversЗащита от:
frontend http_front
bind *:80
maxconn 10000
default_backend web_serversКогда использовать:
frontend http_front
bind *:80
# Кастомный формат лога
log-format "%ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r"
# Логирование только ошибок
option dontlog-normal
default_backend web_serversfrontend https_front
# Bind с SSL
bind *:443 ssl crt /etc/haproxy/certs/site.pem alpn h2,http/1.1
# HTTP/2 only (опционально)
# http2
# Rate limiting
stick-table type ip size 100k expire 30s store http_req_rate(10s)
http-request track-sc0 src
http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }
# Access control
acl blocked_ips src -f /etc/haproxy/blocked_ips.txt
http-request deny if blocked_ips
# Security headers
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains"
http-response set-header X-Frame-Options "SAMEORIGIN"
http-response set-header X-Content-Type-Options "nosniff"
# Logging
option httplog
log-format "%ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r"
# Default backend
default_backend web_serversbind определяет где HAProxy слушает: IP, порт, SSLbind *:443 ssl crt /path/to/cert.pemalpn h2,http/1.1 и SSLИзучим секцию backend: пул серверов, балансировка, health checks.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.