Данная статья применима к:
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-10
- Astra Linux Special Edition РУСБ.10015-17
- Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
- Astra Linux Special Edition РУСБ.10015-03 (очередное обновление 7.6)
- Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
- Astra Linux Special Edition РУСБ.10015-16 исп. 1
- Astra Linux Special Edition РУСБ.10015-16 исп. 2
- Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)
- Astra Linux Common Edition 2.12
Основные возможности HAProxy
- Несколько алгоритмов определения доступности серверов:
- tcp-check;
- http-check;
- mysql-check;
- Балансировка нагрузки (распределение HTTP-/HTTPS-/TCP-запросов между доступными серверами) на транспортном уровне (layer 4);
- Возможность закрепления определенных клиентов за конкретными обслуживающими серверам (stick-tables);
- Поддержка:
- IPv6 и UNIX sockets;
- Сжатия HTTP/1.1 (deflate, gzip, libslz);
- SSL;
- Полная поддержка постоянного HTTP-соединения;
- Поддержка переменных блоков и сценариев Lua в конфигурации сервера;
- WEB-интерфейс с актуальным состоянием и статистикой работы программы.
Описание стенда
Используется три сервера и одна рабочая станция:
- Основной сервер, на котором установлен haproxy, принимающий и перераспределяющий запросы:
- IP-адрес 192.168.27.200;
- Web-сервер №1:
- имя сервера host1.domain.name;
- IP-адрес 192.168.27.201;
- Web-сервер №2:
- имя сервера host2.domain.name;
- IP-адрес 192.168.27.202;
- Рабочая станция с произвольным именем и адресом, находящаяся в одной сети с основным сервером
Установка пакетов
На основном сервере, который будет принимать запросы и распределять их, необходимо установить пакет haproxy. Это можно сделать с помощью графического менеджера пакетов (см. Графический менеджер пакетов synaptic) или из командной строки командой:
- Если в сети не используется служба DNS, то настроить разрешение имен через файл /etc/hosts и задать имена серверов:
web-сервер №1:
sudo sed -i '$a 192.168.27.201\thost1.domain.name host1' /etc/hosts
sudo hostnamectl set-hostname host1.domain.nameweb-сервер №2:
sudo sed -i '$a 192.168.27.202\thost2.domain.name host2' /etc/hosts
sudo hostnamectl set-hostname host2.domain.name
Установить пакет apache2:
sudo apt install apache2Настроить конфигурацию службы apache2 в файле /etc/apache2/apache2.conf:
Данная операция не требуется для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6) с установленным оперативным обновлением БЮЛЛЕТЕНЬ № 20211008SE16 (оперативное обновление 9) (версия haproxy_2.2.9-2~bpo10+1astra.se0) и более поздних обновлений.sudo sed -i '/AstraMode/{s/on/off/;s/# //}' /etc/apache2/apache2.confПерезапустить службу apache2:
sudo apachectl restart
Настройка haproxy
Настройка параметров haproxy выполняется в конфигурационном файле /etc/haproxy/haproxy.cfg, включающем следующие секции:
- global --- определяет общую конфигурацию для всего HAProxy;
- defaults --- является обязательным и определяет настройки по-умолчанию для остальных разделов;
- frontend --- используется для описания набора интерфейсов для принятия соединений от клиентов, а также правил распределения нагрузки;
- backend --- используется для описания набора серверов, к которым будет выполняться подключение переадресованных входящих соединений, а также определения алгоритма распределения нагрузки;
- listen --- объединенный раздел для описания frontend и backend. Используется для описания прокси-сервера в одном разделе, как правило, только для TCP-трафикa.
В таблице ниже представлены основные примеры значений параметров конфигурационного файла и их описание.
Раздел | Параметр | Описание |
---|---|---|
global | log <address> <facility> [max level [min level]] Пример: log 127.0.0.1 local0 notice | Добавляет сервер системного журнала. Параметр <facility> должен быть одним из 24 стандартных типов регистрации событий:
|
maxconn <number> Пример: maxconn 10000 | Устанавливает максимальное число одновременных подключений для каждого процесса haproxy. | |
nbproc <number> Пример: nbproc 2 | Задает количество процессов haproxy. По умолчанию создается только один процесс haproxy. | |
daemon | Устанавливает процессу haproxy режим работы <<daemon>>. | |
user | Пользователь, от имени которого работает процесс haproxy. | |
group | Группа, от имени которой работает процесс haproxy. | |
chroot /var/lib/haproxy | Устанавливает окружение процесса haproxy. | |
defaults | log global | Включает в регистрацию событий информацию о трафике. |
mode http | Режим работы HAProxy. Возможны два режима:
| |
option dontlognull | Отключает регистрацию пустых подключений. | |
retries 3 | Количество попыток определить состояние обслуживающего сервера после сбоя подключения. | |
option redispatch | Распределяет запросы после сбоя подключения к одному из обслуживающих серверов. | |
option httpclose | Закрывает пассивные соединения. | |
option forwardfor | Включает X-Forwarded-For для передачи IP-адреса клиента обслуживающему серверу. | |
frontend | frontend http | Задает имя frontend. |
bind *:80 | Задает IP-адрес и порт для прослушивания запросов. | |
backend | backend sitecluster | |
balance (roundrobin/leastconn/static-rr/uri/source) | Настройка алгоритма распределения. Поддерживаются следующие алгоритмы:
| |
server srv-1.3.my.com 21.86.21.20:80 cookie site113ha check inter 2000 fall 3 minconn 30 maxconn 70 weight 100 | Описание обслуживающего сервера, где:
| |
stats enable | Включает статистику. | |
fullconn 200 | Задает максимальное значение одновременных подключений. | |
listen listen stats-srv-3.my.com *:8180 | Описывает IP-адрес и порт доступа к статистике. | |
stats uri /stats | URL доступа к статистике. | |
stats realm Haproxy Statistics | Заголовок (title) страницы статистики. | |
stats show-legends | Отображает в статистике дополнительную информацию о параметрах. | |
stats refresh 5s | Указывает интервал автоматического обновления страницы статистики. | |
stats auth test:test | Устанавливает логин и пароль доступа к странице статистики. |
Для проверки работы можно использовать стандартный конфигурационный файл, добавив в него инструкции по приему и распределению запросов, т.е. добавив в файл следующие строки:
frontend http_front bind *:80 stats uri /haproxy?stats default_backend http_back backend http_back balance roundrobin server host1.domain.name 192.168.27.201:80 check server host2.domain.name 192.168.27.202:80 check
После внесения изменений в конфигурационный файл перезапустить службу haproxy:
Нагрузочное тестирование
На рабочей станции выполнить следующий сценарий:
for i in {1..1000} ; do wget --no-cache -qO- http://192.168.27.200/index.html > /dev/null & done wait
В результате выполнения сценария на основном сервере в журнале службы haproxy (файл /var/log/haproxy.log) должны появиться записи, сообщающие о перераспределении нагрузки, следующего вида:
а по адресу http://192.168.27.200/haproxy?stats будет доступнен сводный отчет:
В сводном отчете видно, что web-сервер №1 и web-сервер №2 имеют одинаковый вес, равный 1 (столбец Server:Wght) и запросы между ними были распределены поровну, по 500 на каждый сервер (столбец Sessions:LbTot).
Работа с ненулевыми классификационными метками
Параметр конфигурации astra-mode включает или выключает работу с ненулевыми классификационными метками (см. Метка безопасности: структура и состав). Параметр имеет следующий формат:
astra-mode on | off
По умолчанию при работе в ОС с включенным МРД (Astra Linux Special Edition 1.6 или Astra Linux Special Edition x.7 в режиме максимальной защиты) работа с классификационными метками включена. При этом для управления потоками данных предоставляются два метода выборки:
- метод maclev — проверяется числовое значение иерархического уровня конфиденциальности;
- метод maccat — проверяется числовое значение неиерархической категории конфиденциальности.
Синтаксис:
acl <имя_правила> <метод> <операция_сравнения> <числовое_значение>
Допустимые операции сравнения:
- eq - равно;
- ge - больше или равно;
- gt - больше;
- le - меньше или равно;
- lt - меньше;
Пример использования:
frontend http_frontend bind *:8081 mode http acl maclev_ge_1 maclev ge 1 acl maclev_eq_2 maclev eq 2 acl maccat_eq_0 maccat eq 0 tcp-request content accept if maclev_ge_1 maccat_eq_0 use_backend http_back_2 if maclev_eq_2 maccat_eq_0 option http-keep-alive default_backend http_back_1 backend http_back_1 mode http server s1 host.domain.name:80 backend http_back_2 mode http server s2 host.domain.name:81
В примере:
- Определяются три правила проверки:
- acl maclev_ge_1 maclev ge 1 - иерархический уровень конфиденциальности больше единицы;
- acl maclev_eq_2 maclev eq 2 - иерархический уровень конфиденциальности равен двум;
- acl maccat_eq_0 maccat eq 0 - неиерерхические категории конфиденциальности равны нулю;
- tcp-request content accept if maclev_ge_1 maccat_eq_0 - принимается трафик с иерархическим уровнем конфиденциальности больше единицы и с нулевыми неиерархическими категориями конфиденциальности;
- use_backend http_back_2 if maclev_eq_2 maccat_eq_0 - трафик с иерархическим уровнем конфиденциальности 2 перенаправляется на сервер http_back_2.