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



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

  • ОС СН Смоленск 1.6
  • ОС СН Ленинград 8.1
  • ОС ОН Орёл 2.12
  • Основные возможности HAProxy

    Периодическая проверка доступности обслуживающих серверов, на которые перенаправляются запросы пользователей;

    Несколько алгоритмов определения доступности серверов:

    tcp-check;

    http-check;

    mysql-check;
    Распределение HTTP-/HTTPS-/TCP-запросов между доступными серверами;
    Возможность закрепления определенных клиентов за конкретными обслуживающими серверам (stick-tables);
    Поддержка

    IPv6 и UNIX sockets,

    Сжатия HTTP/1.1 (deflate, gzip, libslz),

    SSL

    Полная поддержка постоянного HTTP-соединения;
    Поддержка переменных блоков и Lua-скриптов в конфигурации сервера;
    WEB-интерфейс с актуальным состоянием и статистикой работы программы.
    \subsubsection{Установка}\label{sec:haproxy_install}
    На основном сервере, который будет принимать запросы и распределять их, необходимо установить пакет HAProxy:
    \begin{verbatim}
    apt install haproxy
    \end{verbatim}


    \subsubsection{Настройка}\label{sec:haproxy_example}
    Настройка выполняется в конфигурационном файле \verb|/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>} --- должен быть одним из 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} & Устанавливает максимальное число одновременных подключений для каждого процесса \verb|haproxy|\\
    \cline{2-3}
    & \RUSBCourier{nbproc <number>}\newline Например, \RUSBCourier{nbproc 2} & Задает количество процессов \verb|haproxy|. По умолчанию создается только один процесс \verb|haproxy| \\
    \cline{2-3}
    & \RUSBCourier{daemon} & Устанавливает процессу \verb|haproxy| режим работы <<daemon>>\\
    \cline{2-3}
    & \RUSBCourier{user} & Пользователь, от имени которого работает процесс \verb|haproxy| \\
    \cline{2-3}
    & \RUSBCourier{group} & Группа, от имени которой работает процесс \verb|haproxy|\\
    \cline{2-3}
    & \RUSBCourier{chroot /var/lib/haproxy} & Устанавливает окружение процесса \verb|haproxy| \\
    \cline{2-3}
    \hline
    \multirow{7}{1mm}\,{\RUSBCourier{defaults}} & \RUSBCourier{log global} & Включает в регистрацию событий информацию о трафике \\
    \cline{2-3}
    & \RUSBCourier{mode http} & Режим работы HAProxy.
    Возможны два режима:
    \begin{itemize}
    \item \verb|http| --- выполняется анализ Layer~7, подходит для распределения http-трафика;
    \item \verb|tcp| --- распределение любого трафика
    \end{itemize}\\
    \cline{2-3}
    & \RUSBCourier{option dontlognull } & Отключает регистрацию пустых подключений \\
    \cline{2-3}
    & \RUSBCourier{retries 3} & Количество попыток определить состояние обслуживающего сервера после сбоя подключения \\
    \cline{2-3}
    & \RUSBCourier{option redispatch} & Распределяет запросы после сбоя подключения к одному из обслуживающих серверов \\
    \cline{2-3}
    & \RUSBCourier{option httpclose} & Закрывает пассивные соединения \\
    \cline{2-3}
    & \RUSBCourier{option forwardfor} & Включает X-Forwarded-For для передачи IP-адреса клиента обслуживающему серверу \\
    \hline
    \multirow{2}{1mm}\,{\RUSBCourier{frontend}} & \RUSBCourier{frontend http} & Задает имя \verb|frontend| \\
    \cline{2-3}
    & \RUSBCourier{bind *:80} & Задает IP-адрес и порт для прослушивания запросов \\
    \hline
    \newpage

    \hline
    \multirow{7}{1mm}\,{\RUSBCourier{backend}} & \RUSBCourier{backend sitecluster} & Задает имя обслуживающего сервера \\
    \cline{2-3}
    & \RUSBCourier{balance (roundrobin/leastconn/ static-rr/uri/source)} & Настройка алгоритма распределения. Поддерживаются следующие алгоритмы:
    \begin{itemize}
    \item \verb|Round Robin| --- направляет новые подключения к следующему серверу в циклическом списке, который видоизменяется при помощи веса сервера, на основании которого идет распределение запросов. Вес сервера можно изменить <<на лету>>. Параметр включается при помощи команды \RUSBCourier{balance roundrobin};
    \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} & Задает максимальное значение одновременных подключений \\

    \hline
    \newpage
    \multirow{7}{1mm}\,{\RUSBCourier{listen}} & \RUSBCourier{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}