Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents


Info
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7)

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)

  • Astra Linux Special Edition РУСБ.10015-16 исп. 1 и исп. 2

  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)

  • Astra Linux Common Edition 2.12



Info
Программное средство HAProxy используется для эффективного масштабирования TCP- и HTTP-приложений, обеспечивая высокую доступность, отказоустойчивость и распределение нагрузки посредством распределения входящих запросов на несколько обслуживающих серверов.
Info

Данная статья применима к:

  • ОС СН Смоленск 1.6
  • ОС СН Ленинград 8.1
  • ОС ОН Орёл 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-интерфейс с актуальным состоянием и статистикой работы программы.
  • \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. Это можно сделать с помощью графического менеджера пакетов или из командной строки командой:

Command
sudo apt install haproxy

На web-серверах:

  1. Если в сети не используется служба DNS, то настроить разрешение имен через файл /etc/hosts и задать имена серверов:
    1. web-сервер №1:

      Command
      sudo sed -i '$a 192.168.27.201\thost1.domain.name host1' /etc/hosts
      sudo hostnamectl set-hostname host1.domain.name


    2. web-сервер №2:

      Command
      sudo sed -i '$a 192.168.27.202\thost2.domain.name host2' /etc/hosts
      sudo hostnamectl set-hostname host2.domain.name


  2. Установить пакет apache2:

    Command
    sudo apt install apache2


  3. Настроить конфигурацию службы apache2 в файле /etc/apache2/apache2.conf:

    Info
    Данная операция не требуется для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6) с установленным оперативным обновлением БЮЛЛЕТЕНЬ № 20211008SE16 (оперативное обновление 9) и более поздних обновлений.


    Command
    sudo sed -i '/AstraMode/{s/on/off/;s/# //}' /etc/apache2/apache2.conf


  4. Перезапустить службу apache2:

    Command
    sudo apachectl restart


Настройка haproxy

Настройка параметров haproxy выполняется в конфигурационном файле /etc/haproxy/haproxy.cfg

|

,


включающем следующие

разделы

секции:

    \begin{itemize}
    \item \verb|
  • global
  • |
  • --- определяет общую конфигурацию для всего HAProxy;
  • \item \verb|
  • defaults
  • |
  • --- является обязательным и определяет настройки по-умолчанию для остальных разделов;
  • \item \verb|
  • frontend
  • |
  • --- используется для описания набора интерфейсов для принятия соединений от клиентов, а также правил распределения нагрузки;
  • \item \verb|
  • backend
  • |
  • --- используется для описания набора серверов, к которым будет выполняться подключение переадресованных входящих соединений, а также определения алгоритма распределения нагрузки;
  • \item \verb|
  • listen
  • |
  • --- объединенный раздел для описания
  • \verb|
  • frontend
  • |
  • и
  • \verb|
  • backend
  • |
  • . Используется для описания прокси-сервера в одном разделе, как правило, только для TCP-трафикa.
  • \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 Раздел &
\centering\arraybackslash Параметр &
\centering\arraybackslash Описание \\
\hhline{|=|=|=|}
\endhead
\noalign{\noindent\normalsize\textit{Окончание таблицы \thetable}\vspace{5pt}}
\hline
\centering\arraybackslash Раздел &
\centering\arraybackslash Параметр &
\centering\arraybackslash Описание \\
\hhline{|=|=|=|}
\endlasthead
\multirow{7}{1mm}\,{\RUSBCourier{
global
}} &

\RUSBCourier{


log <address> <facility>

} \RUSBCourier{

[max level [min level]]

} \newline Например, \RUSBCourier{

Пример: log 127.0.0.1 local0 notice

} &

Добавляет сервер системного журнала.

\RUSBCourier{<facility>} ---

Параметр <facility> должен быть одним из 24 стандартных типов регистрации событий:

\verb|

  • kern
  • user
  • mail
  • daemon
  • auth
  • syslog
  • lpr
| \verb|
  • news
  • uucp
  • cron
  • auth2
  • ftp
  • ntp
  • audit
| \verb|
  • alert
  • cron2
  • local0 local1 local2 local3
| \verb|
  • local4 local5 local6 local7
|\\
\cline{2-3}
& \RUSBCourier{maxconn <number>} \newline Например, \RUSBCourier{maxconn 10000} &

maxconn <number>

Пример: maxconn 10000

Устанавливает максимальное число одновременных подключений для каждого процесса
\verb|haproxy|\\
\cline{2-3}
& \RUSBCourier{nbproc <number>}\newline Например, \RUSBCourier{nbproc 2} & Задает количество процессов \verb|haproxy|
haproxy.

nbproc <number>

Пример: nbproc 2

Задает количество процессов haproxy. По умолчанию создается только один процесс

\verb|haproxy| \\
\cline{2-3}
& \RUSBCourier{daemon} & Устанавливает процессу \verb|haproxy| режим работы <<daemon>>\\
\cline{2-3}
& \RUSBCourier{user} &

haproxy.

daemonУстанавливает процессу haproxy режим работы <<daemon>>.
userПользователь, от имени которого работает процесс
\verb|haproxy| \\
\cline{2-3}
& \RUSBCourier{group} &
haproxy.
groupГруппа, от имени которой работает процесс
\verb|haproxy|\\
\cline{2-3}
& \RUSBCourier{
haproxy.
chroot /var/lib/haproxy
} &
Устанавливает окружение процесса
\verb|haproxy| \\
\cline{2-3}
\hline
\multirow{7}{1mm}\,{\RUSBCourier{defaults}} & \RUSBCourier{log global} &
haproxy.
defaultslog globalВключает в регистрацию событий информацию о трафике
\\
\cline{2-3}
& \RUSBCourier{mode http} &
.

mode http

Режим работы HAProxy.


Возможны два режима:


\begin{itemize}

\item \verb|
  • http
|
  • --- выполняется анализ
Layer~7
  • на сетевом уровне Layer7, подходит для распределения http-трафика;
\item \verb|
  • tcp
|
  • --- распределение любого трафика

\end{itemize}\\
\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-адреса клиента обслуживающему серверу
\\
.
\hline
\multirow{2}{1mm}\,{\RUSBCourier{frontend}} & \RUSBCourier{frontend http} & Задает имя \verb|frontend| \\
\cline{2-3}
& \RUSBCourier{
frontendfrontend httpЗадает имя frontend.

bind *:80
} &
Задает IP-адрес и порт для прослушивания запросов
\\
\hline
\newpage\hline
\multirow{7}{1mm}\,{\RUSBCourier{backend}} & \RUSBCourier{backend sitecluster} & Задает имя обслуживающего сервера \\
\cline{2-3}
& \RUSBCourier{
.
backendbackend sitecluster

balance (roundrobin/leastconn/static-rr/uri/source)

} &


Настройка алгоритма распределения. Поддерживаются следующие алгоритмы:

\begin{itemize}
\item \verb|
  • Round Robin
|
  • --- направляет новые подключения к следующему серверу в циклическом списке, который видоизменяется при помощи веса сервера, на основании которого идет распределение запросов. Вес сервера можно изменить <<на лету>>. Параметр включается при помощи команды
\RUSBCourier{
  • balance
roundrobin
  • roundrobi};
\item \verb|
  • Least Connected
|
  • --- направляет новые подключения к серверу с наименьшим числом соединений. Параметр включается при помощи команды
\RUSBCourier{
  • balance leastconn
}
  • ;
\item \verb|
  • Static Round Robin
|
  • --- направляет новые подключения к следующему серверу в циклическом списке, который видоизменяется при помощи веса сервера, на основании которого идет распределение запросов. В отличие от стандартной реализации
\verb|
  • Round Robin
|
  • , в данном алгоритме нельзя изменить вес сервера <<на лету>>. Изменение веса сервера требует перезагрузки HAProxy. Параметр включается при помощи команды
\RUSBCourier{
  • balance static-rr
}
  • ;
\item \verb|
  • Source
|
  • --- выбирает сервер исходя из хеша, построенного на основе IP-адреса пользователя. Таким образом, пользователь всегда обращается к одному и тому же серверу

\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
} &

Описание обслуживающего сервера, где:

\begin{itemize}
\item \verb|
  • srv-1.3.my.com
|
  • --- имя сервера;
\item \verb|
  • 21.86.21.20:80
|
  • --- IP-адрес: порт;
\item \verb|
  • cookie site113ha
|
  • --- задание cookie, необходимого для правильного распределения сессий клиентов;
\item \verb|
  • check inter 2000 fall 3
|
  • --- проверка доступности сервера каждые
2~с
  • , при наличии трех ошибок считать сервер недоступным;
\item \verb|
  • minconn 30 maxconn 70
|
  • --- организация очереди запросов, ограничение не более 70 одновременно обрабатывающихся запросов;
\item \verb|
  • weight 100
|
  • --- вес сервера, возможные значения от 1 до 100

\end{itemize} \\
\cline{2-3}
& \RUSBCourier{stats enable} & Включает статистику \\
\cline{2-3}
& \RUSBCourier{fullconn 200} &
  • .

stats enable

Включает статистику.

fullconn 200Задает максимальное значение одновременных подключений
\\
\hline
\newpage
\multirow{7}{1mm}\,{\RUSBCourier{listen}} & \RUSBCourier{
.

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
} &
Устанавливает логин и пароль доступа к странице статистики
\\
\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 webserver1 192.168.25.11:80 cookie serv1 check
server webserver2 192.168.25.12:80 cookie serv2 check
\end{verbatim}
\end{RUSBExample}
.

Для проверки работы можно использовать стандартный конфигурационный файл, добавив в него инструкции по приему и распределению запросов, т.е. добавив в файл следующие строки:


Code Block
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

Нагрузочное тестирование

На рабочей станции выполнить следующий сценарий:

Code Block
languagebash
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) должны появиться записи, сообщающие о перераспределении нагрузки, следующего вида:
Image Added
а по адресу http://192.168.27.200/haproxy?stats будет доступнен сводный отчет:
Image Added

В сводном отчете видно, что web-сервер №1 и web-сервер №2 имеют одинаковый вес, равный 1 (столбец Server:Wght) и запросы между ними были распределены поровну, по 500 на каждый сервер (столбец Sessions:LbTot).

Работа с метками конфиденциальности

Info
Данный раздел применим к Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6) с установленным оперативным обновлением БЮЛЛЕТЕНЬ № 20211008SE16 (оперативное обновление 9) и более поздних обновлений.

Параметр конфигурации astra-mode включает или выключает работу с метками конфиденциальности (см. Метка безопасности: структура и состав). Параметр имеет следующий формат:

Code Block
astra-mode on | off

По умолчанию при работе в ОС с включенным МРД (Astra Linux Special Edition 1.6 или 1.7 в режиме максимальной защиты) работа метками конфиденциальности включена. При этом для управления потоками данных предоставляются два метода выборки:

  • метод maclev — проверяется числовое значение иерархического уровня конфиденциальности;
  • метод maccat — проверяется числовое значение неиерархической категории конфиденциальности.

Синтаксис:

Code Block
acl <имя_правила> <метод> <операция_сравнения> <числовое_значение>

Допустимые операции сравнения:

  • eq - равно;
  • ge - больше или равно;
  • gt - больше;
  • le - меньше или равно;
  • lt - меньше;

Пример использования:

Code Block
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.