Оглавление |
---|
Информация | ||
---|---|---|
| ||
|
Информация |
---|
Программное средство HAProxy используется для эффективного масштабирования TCP- и HTTP-приложений, обеспечивая высокую доступность, отказоустойчивость и распределение нагрузки посредством распределения входящих запросов на несколько обслуживающих серверов. |
Информация |
---|
Данная статья применима к:
|
Основные возможности 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-интерфейс с актуальным состоянием и статистикой работы программы. \subsubsection{Установка}\label{sec:haproxy_install}
Описание стенда
Используется три сервера и одна рабочая станция:
- Основной сервер, на котором установлен 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:\begin{verbatim}
apt install haproxy
\end{verbatim}\subsubsection{Настройка}\label{sec:haproxy_example}
Настройка выполняется в конфигурационном файле \verb|
haproxy. Это можно сделать с помощью графического менеджера пакетов (см. Графический менеджер пакетов synaptic) или из командной строки командой:
Command |
---|
sudo apt install haproxy |
На web-серверах:
- Если в сети не используется служба DNS, то настроить разрешение имен через файл /etc/hosts и задать имена серверов:
web-сервер №1:
Command sudo sed -i '$a 192.168.27.201\thost1.domain.name host1' /etc/hosts
sudo hostnamectl set-hostname host1.domain.nameweb-сервер №2:
Command sudo sed -i '$a 192.168.27.202\thost2.domain.name host2' /etc/hosts
sudo hostnamectl set-hostname host2.domain.name
Установить пакет apache2:
Command 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) и более поздних обновлений. Command sudo sed -i '/AstraMode/{s/on/off/;s/# //}' /etc/apache2/apache2.conf Перезапустить службу apache2:
Command sudo apachectl restart
Настройка haproxy
Настройка параметров haproxy выполняется в конфигурационном файле /etc/haproxy/haproxy.cfg
|,
включающем следующие секции:
- global разделы:
- --- определяет общую конфигурацию для всего HAProxy; \item \verb|
- defaults |
- --- является обязательным и определяет настройки по-умолчанию для остальных разделов; \item \verb|
- frontend |
- --- используется для описания набора интерфейсов для принятия соединений от клиентов, а также правил распределения нагрузки; \item \verb|
- backend |
- --- используется для описания набора серверов, к которым будет выполняться подключение переадресованных входящих соединений, а также определения алгоритма распределения нагрузки; \item \verb|
- listen |
- --- объединенный раздел для описания \verb|
- frontend |
- и \verb|
- backend |
- . Используется для описания прокси-сервера в одном разделе, как правило, только для TCP-трафикa.
\begin{itemize}
\item \verb|global|
\end{itemize}В таблице~\ref{tbl:haproxy_conf}
В таблице ниже представлены основные примеры значений параметров конфигурационного файла и их описание.
\begin{longtable}[l]{|p{25mm}|p{55mm}|p{90mm}|}\RUSBCaption{Параметры конфигурационного файла \RUSBCourier{/etc/haproxy/haproxy.cfg}}
\label{tbl:haproxy_conf}\\
\hline
\centering\arraybackslash Раздел &
\centering\arraybackslash Параметр &
\centering\arraybackslash Описание \\
\hhline{|=|=|=|}\endfirsthead
\noalign{\noindent\normalsize\textit{Продолжение таблицы \thetable}\vspace{5pt}}
\hline
\centering\arraybackslash
Раздел |
---|
Параметр |
---|
Описание |
---|
\endhead
\noalign{\noindent\normalsize\textit{Окончание таблицы \thetable}\vspace{5pt}}
\hline
\centering\arraybackslash Раздел &
\centering\arraybackslash Параметр &
\centering\arraybackslash Описание \\
\hhline{|=|=|=|}
\endlasthead
\multirow{7}{1mm}\,{\RUSBCourier{
global |
log <address> <facility> |
[max level [min level]] |
Пример: log 127.0.0.1 local0 notice |
Добавляет сервер системного журнала. |
Параметр <facility> должен быть одним из 24 стандартных типов регистрации событий: |
|
|
|
|
& \RUSBCourier{maxconn <number>} \newline Например, \RUSBCourier{maxconn 10000} &
maxconn <number> Пример: maxconn 10000 | Устанавливает максимальное число одновременных подключений для каждого процесса |
\cline{2-3}
& \RUSBCourier{nbproc <number>}\newline Например, \RUSBCourier{nbproc 2} & Задает количество процессов \verb|haproxy|
haproxy. | |
nbproc <number> Пример: nbproc 2 | Задает количество процессов haproxy. По умолчанию создается только один процесс |
\cline{2-3}
& \RUSBCourier{daemon} & Устанавливает процессу \verb|haproxy| режим работы <<daemon>>\\
\cline{2-3}
& \RUSBCourier{user} &
haproxy. | |
daemon | Устанавливает процессу haproxy режим работы <<daemon>>. |
user | Пользователь, от имени которого работает процесс |
\cline{2-3}
& \RUSBCourier{group} &
haproxy. | |
group | Группа, от имени которой работает процесс |
\cline{2-3}
& \RUSBCourier{
haproxy. |
chroot /var/lib/haproxy |
Устанавливает окружение процесса |
\cline{2-3}
\hline
\multirow{7}{1mm}\,{\RUSBCourier{defaults}} & \RUSBCourier{log global} &
haproxy. | ||
defaults | log global | Включает в регистрацию событий информацию о трафике |
\cline{2-3}
& \RUSBCourier{mode http} &
. | ||
mode http | Режим работы HAProxy. |
Возможны два режима: |
\item \verb|
|
|
|
|
|
\cline{2-3}
& \RUSBCourier{
option dontlognull |
Отключает регистрацию пустых подключений |
\cline{2-3}
& \RUSBCourier{retries 3} &
. | ||
retries 3 | Количество попыток определить состояние обслуживающего сервера после сбоя подключения |
\cline{2-3}
& \RUSBCourier{option redispatch} &
. | ||
option redispatch | Распределяет запросы после сбоя подключения к одному из обслуживающих серверов |
\cline{2-3}
& \RUSBCourier{option httpclose} &
. | ||
option httpclose | Закрывает пассивные соединения |
\cline{2-3}
& \RUSBCourier{option forwardfor} &
. | ||
option forwardfor | Включает X-Forwarded-For для передачи IP-адреса клиента обслуживающему серверу |
. |
\multirow{2}{1mm}\,{\RUSBCourier{frontend}} & \RUSBCourier{frontend http} & Задает имя \verb|frontend| \\
\cline{2-3}
& \RUSBCourier{
frontend | frontend http | Задает имя frontend. |
bind *:80 |
Задает IP-адрес и порт для прослушивания запросов |
\hline
\newpage\hline
\multirow{7}{1mm}\,{\RUSBCourier{backend}} & \RUSBCourier{backend sitecluster} & Задает имя обслуживающего сервера \\
\cline{2-3}
& \RUSBCourier{
. | ||
backend | backend sitecluster | |
balance (roundrobin/leastconn/static-rr/uri/source) |
Настройка алгоритма распределения. Поддерживаются следующие алгоритмы: |
\item \verb|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\end{itemize} \\
\cline{2-3}
& \RUSBCourier{
| |
server srv-1.3.my.com 21.86.21.20:80 cookie site113ha check inter 2000 fall 3 minconn 30 maxconn 70 weight 100 |
Описание обслуживающего сервера, где: |
\item \verb|
|
|
|
|
|
|
|
|
|
|
|
|
|
\end{itemize} \\
\cline{2-3}
& \RUSBCourier{stats enable} & Включает статистику \\
\cline{2-3}
& \RUSBCourier{fullconn 200} &
| ||
stats enable | Включает статистику. | |
fullconn 200 | Задает максимальное значение одновременных подключений |
. |
\newpage
\multirow{7}{1mm}\,{\RUSBCourier{listen}} & \RUSBCourier{listen
listen listen stats-srv-3.my.com *:8180 |
Описывает IP-адрес и порт доступа к статистике |
\cline{2-3}
& \RUSBCourier{
. | |
stats uri /stats |
URL доступа к статистике |
\cline{2-3}
& \RUSBCourier{
. | |
stats realm Haproxy |
Statistics |
Заголовок (title) страницы статистики |
\cline{2-3}
& \RUSBCourier{
. | |
stats show-legends |
Отображает в статистике дополнительную информацию о параметрах |
\cline{2-3}
& \RUSBCourier{
. | |
stats refresh 5s |
Указывает интервал автоматического обновления страницы статистики |
\cline{2-3}
& \RUSBCourier{
. | |
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:
Command |
---|
sudo systemctl restart 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 Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6) с установленным оперативным обновлением БЮЛЛЕТЕНЬ № 20211008SE16 (оперативное обновление 9) и более поздних обновлений. |
Параметр конфигурации 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. \\
\hline
\end{longtable}
\begin{RUSBExample}
Конфигурационный файл для распределения нагрузки сервера Apache
\begin{verbatim}
global
log /dev/log local0
log /dev/log local1 notice
maxconn 40000
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:
ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:
!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
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
listen webcluster *:80
mode http
balance leastconn
option forwardfor
cookie serv insert
option httpclose
server webserver2 192.168.25.12:80 cookie serv2 check
\end{verbatim}
\end{RUSBExample}