Содержание

Versions Compared

Key

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

Table of Contents


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



Info

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

  • ОС СН Смоленск 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}

. Это можно сделать с помощью графического менеджера пакетов или из командной строки командой:

Command
sudo apt install haproxy


Настройка

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

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

Параметр <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} & Закрывает пассивные соединения \\
\cline{2-3}
& \RUSBCourier{option forwardfor} &
.

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

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

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}


Expand

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}