Данная статья применима к:
- ОС СН Смоленск 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.httplisten webcluster *:80
mode http
balance leastconn
option forwardfor
cookie serv insert
option httpcloseserver webserver1 192.168.25.11:80 cookie serv1 check
server webserver2 192.168.25.12:80 cookie serv2 check
\end{verbatim}
\end{RUSBExample}