Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Оглавление


Информация
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



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

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

ОС СН Смоленск 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-интерфейс с актуальным состоянием и статистикой работы программы.

    Описание стенда

    Используется три сервера и одна рабочая станция:

    • Основной сервер, на котором установлен 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;
    • Рабочая станция с произвольным именем и адресом, находящаяся в одной сети с основным сервером

    Установка пакетов

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

    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:

      Информация
      Данная операция не требуется для 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, включающем следующие секции:

    • 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 стандартных типов регистрации событий:

    • kern
    • user
    • mail
    • daemon
    • auth
    • syslog
    • lpr
    • news
    • uucp
    • cron
    • auth2
    • ftp
    • ntp
    • audit
    • alert
    • cron2
    • local0 local1 local2 local3 local4 local5 local6 local7

    maxconn <number>

    Пример: maxconn 10000

    Устанавливает максимальное число одновременных подключений для каждого процесса haproxy.

    nbproc <number>

    Пример: nbproc 2

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

    daemonУстанавливает процессу haproxy режим работы <<daemon>>.
    userПользователь, от имени которого работает процесс haproxy.
    groupГруппа, от имени которой работает процесс haproxy.
    chroot /var/lib/haproxyУстанавливает окружение процесса haproxy.
    defaultslog globalВключает в регистрацию событий информацию о трафике.

    mode http

    Режим работы HAProxy. Возможны два режима:

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

    option dontlognullОтключает регистрацию пустых подключений.

    retries 3Количество попыток определить состояние обслуживающего сервера после сбоя подключения.

    option redispatchРаспределяет запросы после сбоя подключения к одному из обслуживающих серверов.

    option httpcloseЗакрывает пассивные соединения.

    option forwardforВключает X-Forwarded-For для передачи IP-адреса клиента обслуживающему серверу.
    frontendfrontend httpЗадает имя frontend.

    bind *:80Задает IP-адрес и порт для прослушивания запросов.
    backendbackend sitecluster

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


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

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

    server srv-1.3.my.com 21.86.21.20:80 cookie site113ha check inter 2000 fall 3 minconn 30 maxconn 70 weight 100

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

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

    stats enable

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

    fullconn 200Задает максимальное значение одновременных подключений.

    listen

    listen stats-srv-3.my.com *:8180

    Описывает IP-адрес и порт доступа к статистике.


    stats uri /statsURL доступа к статистике.

    stats realm Haproxy

    Statistics

    Заголовок (title) страницы статистики.

    stats show-legendsОтображает в статистике дополнительную информацию о параметрах.

    stats refresh 5sУказывает интервал автоматического обновления страницы статистики.

    stats auth test:testУстанавливает логин и пароль доступа к странице статистики.

    Пример конфигурационного файла для распределения нагрузки сервера Apache

    Раскрыть

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


    Блок кода
    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

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

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

    Блок кода
    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).

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

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

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

    Блок кода
    astra-mode on | off

    По умолчанию при работе в ОС с включенным МРД (Astra Linux Special Edition 1.6 или 1.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.

    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