HAProxy (High Availability Proxy) – це відкритий, високопродуктивний балансувальник навантаження TCP/HTTP та проксі-сервер, який розподіляє мережевий трафік між кількома бекенд-серверами для максимізації продуктивності, надійності та ємності сервера. Він працює як на рівні 4 (TCP), так і на рівні 7 (HTTP) моделі OSI, забезпечуючи точне управління трафіком, високу доступність та ефективне використання ресурсів для додатків та сервісів.
HAProxy відомий своєю швидкістю, стабільністю та здатністю обробляти дуже великі обсяги трафіку. Його зазвичай розгортають перед веб-серверами, серверами додатків та кластерами баз даних, щоб забезпечити рівномірний розподіл запитів клієнтів, запобігти перевантаженню серверів та полегшити безперебійні операції з обслуговування.
Балансування навантаження за допомогою HAProxy
Балансування навантаження – це процес розподілу мережевого трафіку між групою бекенд-серверів, відомих як серверна ферма або кластер. HAProxy використовує різні алгоритми для визначення того, який сервер отримає наступний запит, з метою оптимізації використання ресурсів, максимізації пропускної здатності, мінімізації часу відгуку та уникнення перевантаження окремих серверів.
Ключові аспекти балансування навантаження за допомогою HAProxy включають:
- Вибір алгоритму: HAProxy пропонує кілька алгоритмів для різних потреб додатків.
- Перевірки стану сервера: Безперервний моніторинг доступності та чутливості бекенд-серверів.
- Вагове значення сервера: Пріоритизація певних серверів для отримання більшого трафіку.
Алгоритми балансування навантаження
HAProxy надає ряд алгоритмів, що конфігуруються в секції backend:
roundrobin: Розподіляє запити послідовно до кожного сервера в групі бекендів. Алгоритм за замовчуванням.leastconn: Направляє нові з'єднання до сервера з найменшою кількістю активних з'єднань. Оптимально для довгоживучих з'єднань.source: Використовує хеш IP-адреси джерела для визначення сервера. Забезпечує послідовне підключення клієнта до одного й того ж сервера, корисно для додатків зі збереженням стану без явного збереження сесії.uri: Хешує ліву частину URL (до рядка запиту) для вибору сервера. Корисно для кешуючих проксі.hdr(<name>): Хешує значення вказаного HTTP-заголовка.random: Випадковим чином вибирає сервер.
backend web_servers
balance roundrobin
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check
server web3 192.168.1.12:80 check
Проксіювання за допомогою HAProxy
Проксіювання передбачає використання проміжного сервера, який діє від імені клієнта або сервера. HAProxy функціонує як зворотний проксі, приймаючи з'єднання від клієнтів і пересилаючи їх до бекенд-серверів, а потім повертаючи відповіді серверів клієнтам. Цей рівень абстракції забезпечує безпеку, продуктивність та операційні переваги.
Проксіювання рівня 4 (TCP)
На рівні 4 HAProxy пересилає необроблені TCP-з'єднання без перевірки вмісту на рівні програми. Це підходить для не-HTTP сервісів, баз даних або користувацьких протоколів, де перевірка вмісту не потрібна або небажана.
listen mysql_cluster
bind *:3306
mode tcp
balance leastconn
server db1 192.168.1.20:3306 check
server db2 192.168.1.21:3306 check
Проксіювання рівня 7 (HTTP)
На рівні 7 HAProxy може перевіряти та маніпулювати заголовками HTTP-запитів та відповідей, URL-адресами та файлами cookie. Це дозволяє використовувати розширені функції, такі як маршрутизація на основі вмісту, термінація SSL, переписування URL-адрес та збереження сесії.
frontend http_frontend
bind *:80
mode http
default_backend web_servers
Компоненти конфігурації HAProxy
Конфігурація HAProxy зазвичай знаходиться в /etc/haproxy/haproxy.cfg і структурована на кілька секцій.
Секція global
Секція global визначає параметри для всього процесу, такі як логування, налаштування безпеки та обмеження продуктивності. Ці налаштування застосовуються до всього екземпляра HAProxy.
global
log /dev/log local0 info
maxconn 20000
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
daemon
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
Секція defaults
Секція defaults визначає параметри за замовчуванням для всіх секцій listen, frontend та backend, що йдуть за нею. Це зменшує надмірність конфігурації.
defaults
mode http
log global
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option httplog
option dontlognull
option http-server-close
Секція frontend
frontend визначає публічну точку входу, де HAProxy прослуховує клієнтські з'єднання. Вона вказує IP-адресу, порт, протокол (mode) та правила маршрутизації запитів до конкретних бекендів за допомогою списків контролю доступу (ACL).
frontend http_in
bind *:80
mode http
acl host_app1 hdr(host) -i app1.example.com
acl host_app2 hdr(host) -i app2.example.com
use_backend app1_servers if host_app1
use_backend app2_servers if host_app2
default_backend default_web_servers
Секція backend
backend визначає групу серверів, до яких HAProxy може пересилати запити. Вона включає алгоритм балансування навантаження, параметри перевірки стану та визначення окремих серверів.
backend app1_servers
balance leastconn
option httpchk GET /healthz
server s1 10.0.0.10:8080 check inter 2000 fall 3 rise 2
server s2 10.0.0.11:8080 check inter 2000 fall 3 rise 2 backup
check: Вмикає перевірки стану для сервера.inter 2000: Перевіряє кожні 2000 мс.fall 3: Позначає сервер як непрацюючий після 3 послідовних невдалих перевірок.rise 2: Позначає сервер як працюючий після 2 послідовних успішних перевірок.backup: Сервер буде використовуватися лише тоді, коли всі інші не-резервні сервери не працюють.
Секція listen
Секція listen поєднує функціональність frontend та backend в одному блоці. Це часто використовується для простіших конфігурацій або для сервісів, таких як сторінка статистики HAProxy.
listen stats_page
bind *:8080
mode http
stats enable
stats uri /haproxy?stats
stats realm HAProxy\ Statistics
stats auth admin:securepassword
stats refresh 5s
Списки контролю доступу (ACL)
ACL – це потужні умовні правила, що використовуються для відповідності певним критеріям у клієнтських запитах (наприклад, IP-адреса джерела, заголовок хоста, шлях URL, метод HTTP). Вони дозволяють динамічну маршрутизацію, перемикання вмісту та блокування.
frontend website_frontend
bind *:443 ssl crt /etc/haproxy/certs/mydomain.pem
# ACLs based on path
acl is_admin_area path_beg /admin
acl is_api_v1 path_beg /api/v1
# Route based on ACLs
use_backend admin_backend if is_admin_area
use_backend api_v1_backend if is_api_v1
default_backend main_website_backend
Перевірки стану (Health Checks)
HAProxy постійно моніторить стан бекенд-серверів, щоб гарантувати, що запити надсилаються лише до працюючих екземплярів. Якщо сервер не проходить перевірки стану, HAProxy тимчасово видаляє його з ротації, доки він не відновиться.
- TCP Check (
check): Базова перевірка підключення до порту. - HTTP Check (
option httpchk): Надсилає HTTP-запит (наприклад,GET /health) і очікує дійсний HTTP-статус-код (2xx або 3xx). - SSL Hello Check (
ssl-hello-chk): Перевіряє, чи може бути встановлено SSL-рукостискання.
Розширені функції HAProxy
Термінація та розвантаження SSL
HAProxy може обробляти шифрування та дешифрування SSL/TLS, розвантажуючи це інтенсивне для процесора завдання з бекенд-серверів. Він дешифрує вхідний HTTPS-трафік і пересилає звичайний HTTP до бекенду, або може повторно шифрувати для наскрізного SSL.
frontend https_in
bind *:443 ssl crt /etc/haproxy/certs/mydomain.pem
mode http
default_backend web_servers
"Липкі" сесії (Persistence)
"Липкі" сесії гарантують, що запити клієнта послідовно маршрутизуються до одного й того ж бекенд-сервера протягом усієї його сесії. Це критично важливо для додатків, які підтримують стан сесії на окремих серверах.
- Стійкість на основі файлів cookie: HAProxy вставляє файл cookie в браузер клієнта, який потім використовується для ідентифікації правильного бекенд-сервера для наступних запитів.
- Стійкість на основі IP-адреси джерела: Використовує IP-адресу джерела клієнта для послідовної маршрутизації до того ж сервера (менш надійно за NAT).
backend web_servers_sticky
balance roundrobin
cookie SERVERID insert indirect nocache
server s1 10.0.0.10:80 check cookie s1
server s2 10.0.0.11:80 check cookie s2
Маршрутизація на основі вмісту
Маршрутизація на основі вмісту направляє трафік до різних пулів бекенд-серверів на основі конкретних атрибутів у запиті клієнта, таких як запитуваний шлях URL, заголовок HTTP-хоста або користувацькі HTTP-заголовки. Це полегшує архітектури мікросервісів або багатокористувацькі додатки.
(Приклад вже показано в секції frontend з acl host_app1 та use_backend).
Висока доступність самого HAProxy
Хоча HAProxy розроблений для високої доступності бекенд-сервісів, самі екземпляри HAProxy можуть бути зроблені високодоступними за допомогою зовнішніх механізмів, таких як VRRP (Virtual Router Redundancy Protocol) з такими інструментами, як Keepalived. Це створює плаваючу IP-адресу, яка автоматично перемикається між основним та вторинним серверами HAProxy у разі збою, забезпечуючи безперервну роботу служби балансування навантаження.
HAProxy проти Nginx (Коротке порівняння)
І HAProxy, і Nginx можуть функціонувати як зворотні проксі та балансувальники навантаження. Їхні основні цілі проектування та типові схеми розгортання відрізняються.
| Функція | HAProxy | Nginx |
|---|---|---|
| Основна роль | Спеціалізований, високопродуктивний балансувальник навантаження та проксі | Веб-сервер, зворотний проксі, балансувальник навантаження, кеш |
| Продуктивність | Надзвичайно висока (особливо L4/TCP) | Висока (хороший універсал) |
| Конфігурація | Створений спеціально для балансування навантаження, широкі можливості | Більш загального призначення, гнучкий |
| Кешування | Обмежене (потребує зовнішніх модулів) | Вбудоване, потужне HTTP-кешування |
| Обслуговування статичних файлів | Не є його основним фокусом | Відмінне, високооптимізоване |
| Модульність | Відносно монолітний | Високомодульний з багатою екосистемою модулів |
| Термінація SSL | Так | Так |
| WebSockets | Так | Так |
HAProxy часто обирають для критичних середовищ з високим трафіком, де першочергове значення мають чиста продуктивність балансування навантаження та надійні перевірки стану. Nginx часто використовується, коли потрібна комбінація веб-обслуговування, кешування та зворотного проксіювання, поряд з балансуванням навантаження. Часто їх розгортають разом, при цьому HAProxy виступає як основний балансувальник навантаження, а Nginx обробляє специфічне проксіювання на рівні додатків або статичний контент.
