- Основные возможности HAProxy
- Алгоритмы определения доступности серверов
- Балансировка нагрузки
- WEB-интерфейс
- Терминология HAProxy
- Списки управления доступом — ACL
- Global
- Frontend
- Backend
- Defaults
- Настройка HAProxy: пример конфига
- Тестирование HAProxy: проверка конфига
HAProxy — это серверное программное обеспечение с открытым исходным кодом для Unix. Название является аббревиатурой от High Availability Proxy, что можно перевести как «прокси-сервер высокой доступности». Решение позволяет администраторам веб-приложений настраивать правила маршрутизации запросов для повышения надежности и производительности систем. Для обмена данными ПО использует протоколы TCP, HTTP и UDP.
Основные возможности HAProxy
High Availability Proxy применяется в высоконагруженных системах для распределения потока входящих обращений по нескольким серверным узлам. Установка HAProxy позволяет предотвратить перегрузку одного сервера и повысить устойчивость всей системы.
Алгоритмы определения доступности серверов
Программа использует Health Check — технологию, которая помогает определить готовность серверных узлов к приему и обработке запросов. Health Check определяет, отвечает ли сервер и корректно ли он работает. Если узел недоступен, его можно исключить из распределения нагрузки и таким образом гарантировать надежность работы всего сервиса.
Технология включает несколько алгоритмов проверки, например:
- по TCP;
- по HTTP/HTTPS;
- по запросам MySQL.
Алгоритм TCP подходит для простого тестирования работоспособности на уровне сети. Утилита пытается установить соединение с сервером на заданном порту. Если соединение успешно устанавливается и разрывается, сервер считается доступным.
При проверке по HTTP программа отправляет GET или другой HTTP-запрос на серверный узел и анализирует ответ. Сервер считается доступным, если он возвращает ожидаемый статус: например, «200 OK». Веб-сервисам, работающим через HTTPS, можно отправлять защищенный запрос по шифрованному каналу SSL/TLS.
С помощью HAProxy можно определять доступность MySQL, чтобы убедиться, что база доступна, а сервер готов обрабатывать команды. Программа проверяет аутентификацию клиента или пакет подтверждения MySQL. Аналогичные методы используются для контроля работоспособности PostgreSQL, Redis, почтовых служб SMTP и ESMTP.
Также доступна установка пользовательских скриптов: в конфигурационном файле можно задать периодичность определения состояния серверов, число неудачных проверок, после которых серверный узел считается недоступным, и другие параметры.
Балансировка нагрузки
HAProxy выполняет функции программного балансировщика: распределяет клиентские HTTP-, HTTPS-, TCP-запросы или UDP-пакеты между несколькими серверами. Балансировка трафика ведется на уровнях Host Layers сетевой модели OSI — Open Systems Interconnection:
- L4 — четвертый, или транспортный / transport layer;
- L7 — седьмой, или прикладной / application layer.
Алгоритм распределения запросов можно настроить под архитектуру системы. Основные методы балансировки нагрузки:
- roundrobin — сетевые узлы получают запросы один за другим по очереди;
- leastconn — запрос направляется на сервер с минимальным числом активных соединений;
- source — сообщения от одного клиента всегда направляются на один и тот же сервер на основе хеша IP-адреса клиента;
- uri — маршрутизация ведется на основе хеша URI-запроса.
Метод roundrobin подходит для быстрых вызовов API. Метод leastconn используется в системах с веб-сокетами, в которых соединение между клиентской и серверной частями не закрывается по таймауту или после выполнения запроса, а поддерживается постоянно. Метод source удобен для управления системами с кэшированием данных в оперативной памяти на основе хеш-таблицы: URI-алгоритм — для кэширующих прокси-серверов.
WEB-интерфейс
HAProxy собирает подробную статистику и отображает текущее состояние системы в веб-интерфейсе. Можно отслеживать состояние серверов и сетевого трафика, вести логирование, находить и вовремя устранять уязвимости, чтобы предотвратить сбои при масштабировании и росте нагрузки на сервис.
Функции балансирования, проксирования и тестирования нагрузки серверных узлов позволяют использовать утилиту для решения разных задач. Примеры проектов и направлений:
- веб-разработка — для быстрой обработки входящих запросов от пользователей;
- облачные и гибридные среды — для управления трафиком в сложных распределенных системах;
- API-шлюзы — для маршрутизации вызовов API к серверным службам, балансировки нагрузки, ограничения отправляемых клиентом запросов, мониторинга трафика и решения задач безопасности;
- микросервисная архитектура — для интеллектуального распределения запросов между компонентами системы.
Технология широко используется в IT-инфраструктуре компаний разного масштаба благодаря надежности, производительности и гибкости.
Терминология HAProxy
Балансировщик доступен бесплатно, на официальном сайте представлена подробная документация о его использовании. После установки программы с помощью пакетного менеджера, Docker или команды sudo make install, нужно настроить конфигурацию, а для этого необходимо разобраться в значении основных терминов.
Списки управления доступом — ACL
Access Control Lists позволяют задавать политику принятия или отклонения запросов на основе различных критериев, например, IP-адреса или URI.
Пример настройки ACL:
acl is_static path_end -i .jpg .png .css .js
use_backend static_back if is_static
ACL определяет правила обработки и маршрутизации запросов. Команда use_backend отвечает за выполнение действий на основе условий, заданных в ACL. В нашем примере запросы, оканчивающиеся на .jpg, .png, .css, или .js, будут направлены на backend static_back.
Также с помощью списков управления можно ограничить доступ для заданных IP. Например:
acl allowed_ip src 192.168.1.0/24
acl denied_ip src 10.0.0.0/8
http-request deny if denied_ip
use_backend allowed_back if allowed_ip
В данной конфигурации запросы с IP-адресов в диапазоне 10.0.0.0/8 будут отклонены, а запросы из сети 192.168.1.0/24 направлены на backend allowed_back.
Условия можно комбинировать, например, задать выполнение определенных действий только для запросов .jpg, .png, .css, .js, поступающих из сети 192.168.1.0/24.
Global
Global — это секция конфигурационного файла с описанием общих параметров процесса работы. Настройки Global влияют на алгоритмы, функции и производительность программы, включая параметры логирования рабочей среды, пользователя и группы, от имени которых будет работать HAProxy-балансировщик.
Пример конфигурации:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/myproxy
stats socket /run/myproxy/admin.sock mode 660 level admin
stats timeout 30s
user myproxy
group myproxy
daemon
tune.bufsize 32768
tune.maxrewrite 1024
maxconn 2000
ssl-default-bind-ciphers HIGH:!aNULL:!MD5
ssl-default-bind-options no-sslv3
Основные элементы global:
- log — добавление сервера системного журнала и параметров логирования;
- chroot — корневая директория и окружение процесса;
- user и group — пользователь и группа, от имени которых будет работать процесс;
- daemon — перевод HAProxy в фоновый режим;
- stats socket — путь сокета для доступа к статистике и управлению утилитой;
- tune.bufsize — размер буфера для запросов и ответов;
- tune.maxrewrite — резерв объема в буфере для перезаписи данных;
- maxconn — максимальное количество одновременных соединений.
Frontend
Frontend — раздел конфигурации, который описывает набор интерфейсов, точку входа трафика от клиентских приложений и способ передачи запросов на обработку. Фронтенд задает правила, по которым HAProxy будет принимать входящие запросы, проводить маршрутизацию, фильтрацию и другие операции.
Пример:
frontend http_front
bind *:80
default_backend http_back
Основные элементы конфигурации frontend:
- frontend http — определение режима фронтенда;
- bind — IP и port, на которых балансировщик будет прослушивать входящие соединения;
- default_backend — backend, на который будут направляться все запросы, если они не соответствуют установленным ACL или правилам маршрутизации;
- acl — политика принятия или отклонения запросов;
- use_backend — backend, который нужно использовать в зависимости от условий, заданных ACL.
Backend
Backend — секция, которая отвечает за распределение трафика между серверными компонентами, исходя из установленного способа обработки входящих соединений. Бэкенд определяет группу серверов, на которые нужно перенаправлять трафик от frontend. В настройки входит описание серверов, методы определения доступности и балансировки нагрузки.
Пример:
backend http_back
balance roundrobin
server web1 192.168.1.1:80
server web2 192.168.1.2:80
Основные элементы конфигурации:
- backend http — определяет режим бэкенда;
- balance — задает алгоритм балансировки нагрузки между серверами в backend;
- server — определяет IP-адрес и порт одного серверного узла в пуле серверов.
Дополнительные элементы конфигурации:
- option — настройка алгоритмов проверок работоспособности и доступности сервера;
- retries — число попыток повторного подключения к серверу при неудачном соединении;
- timeout — установка таймаутов для различных операций, например, на соединение, запросы клиента и ответы сервера;
- stats enable — включение статистики;
- fullconn — максимальное количество одновременных соединений.
Раздел backend позволяет эффективно управлять трафиком, обеспечивать высокую доступность и производительность веб-сервисов.
Defaults
Defaults — это секция с параметрами по умолчанию, которые применяются ко всем frontend и backend, если в них не указаны специфические настройки. Defaults помогает сократить объем конфигурации за счет фиксирования основных параметров. При этом в других разделах файла стандартные параметры можно переопределить.
Основные элементы конфигурации defaults:
- log — параметры логирования;
- mode — режим работы, например, TCP или HTTP;
- option — функции, например, httplog — добавление в лог HTTP-запросов, состояния сеанса и таймеров;
- timeout — таймауты по умолчанию для соединения, ожидания ответа от сервера и других действий;
- errorfile — документ с кодами ошибок;
- maxconn — максимальное количество одновременных соединений.
Настройка HAProxy: пример конфига
Файл состоит из секций frontend, backend, defaults и global. Также предусмотрен необязательный раздел listen, который объединяет frontend и backend. Обычно listen, defaults и global используются с параметрами по умолчанию или минимальными изменениями, а основную функциональность отражают в секциях frontend и backend.
Рассмотрим пример конфигурации HAProxy с функцией балансировщика нагрузки. Допустим, у нас есть три веб-сервера, и мы хотим распределить запросы между ними с помощью метода roundrobin. Конфигурационный файл будет выглядеть следующим образом:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/myproxy
stats socket /run/myproxy/admin.sock mode 660 level admin
stats timeout 30s
user myproxy
group myproxy
daemon
defaults
log global
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
errorfile 400 /etc/myproxy/errors/400.http
errorfile 403 /etc/myproxy/errors/403.http
errorfile 404 /etc/myproxy/errors/404.http
errorfile 500 /etc/myproxy/errors/500.http
errorfile 502 /etc/myproxy/errors/502.http
errorfile 503 /etc/myproxy/errors/503.http
errorfile 504 /etc/myproxy/errors/504.http
frontend http_front
bind *:80
default_backend http_back
backend http_back
balance roundrobin
server web1 192.168.1.1:80
server web2 192.168.1.2:80
server web3 192.168.1.3:80
Секция frontend http_front определяет фронтенд, который принимает входящие соединения на port 80.
Строка default_backend http_back указывает, что трафик, принятый frontend http_front, должен перенаправляться на backend http_back.
Секция backend http_back определяет бэкенд, который управляет пулом серверов и распределяет трафик с использованием метода балансировки roundrobin.
Дополнительно можно назначить вес каждому серверу, чтобы некоторые узлы получали больше запросов. За установку весов отвечает параметр weight:
server web1 192.168.1.1:80 weight 2
server web2 192.168.1.2:80 weight 1
server web3 192.168.1.3:80 weight 1
Так сервер web1 будет получать в два раза больше запросов, чем web2 и web3.
Тестирование HAProxy: проверка конфига
После установки утилиты и изменения конфигурации откройте в браузере IP-адрес HAProxy и проверьте подключение к backend. На странице статистики убедитесь, что все серверные узлы помечены как активные. Если один или несколько серверов неактивны, попробуйте их перезапустить и пропинговать.
Работоспособность программы можно проверить с помощью следующей команды:
$ haproxy -f /path/to/haproxy.cfg -c
Если конфиг заполнен неправильно, система сообщит номер строки первой обнаруженной ошибки. Если программа не отвечает, проверьте firewall.