В этой заметке мы соберем из исходного кода и установим свежий HAProxy на CentOS7.
Отступление
HAProxy является одним из самых популярных бесплатных балансировщиков нагрузки с открытым исходным кодом.
С его помощью можно создавать отказоустойчивые системы с высокой нагрузкой.
В то же время, на CentOS 7 базируются некоторые отечественные linux дистрибутивы.
Почему бы просто не установить HAProxy из репозиториев CentOS? Дело в том, что
в них лежит слишком старая версия, в которой отсутствует множество полезных возможностей.
Например, отсутствует директива http-request set-path
, которая позволяет "на лету" переписывать URL без
использования перенаправлений.
yum info haproxy
...
Версия: 1.5.18
...
Сборка и установка
Больше никакой воды, приступим к делу. Все команды ниже выполняются от имени суперпользователя.
Установим зависимости для сборки:
yum install pcre-static pcre-devel openssl-devel
Скачаем исходный код. Возможно, Вам понадобится версия новее, смотрите на странице
загрузок HAProxy.
cd /opt
wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.28.tar.gz
Распакуем и перейдем в каталог с исходниками:
tar xzvf haproxy-1.8.28.tar.gz
cd /opt/haproxy-1.8.28/
Соберем HAProxy. Поскольку нам нужна поддержка TLS и SSL, то команда сборки будет выглядеть так:
make -j4 TARGET=linux2628 USE_NS=1 USE_TFO=1 USE_OPENSSL=1 USE_ZLIB=1 USE_PCRE=1 SSL_INC=/usr/local/openssl/include SSL_LIB=/usr/local/openssl/lib
Установим HAProxy:
make install
Общая конфигурация
Далее нам необходимо создать следующие директории и файл для статистики, потому что make install
этого не делает.
mkdir -p /etc/haproxy
mkdir -p /var/lib/haproxy
touch /var/lib/haproxy/stats
Создадим символьную ссылку на бинарный файл haproxy для непривилегированных пользователей.
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
Чтобы создать SysV сервис, нужно скопировать haproxy.init
файл из директории examples
в /etc/init.d/
директорию.
cp /opt/haproxy-1.8.28/examples/haproxy.init /etc/init.d/haproxy
chmod 755 /etc/init.d/haproxy
systemctl daemon-reload
Также, активируем сервис, чтобы он запускался при каждой загрузке системы:
systemctl enable haproxy
Создадим системного пользователя от имени которого процесс haproxy будет запущен:
useradd -r haproxy
Проверим, что мы установили правильную версию с поддержкой необходимых расширений:
haproxy -vv
HA-Proxy version 1.8.28-ef7a974 2021/01/13
Copyright 2000-2021 Willy Tarreau <willy@haproxy.org>
Build options :
TARGET = linux2628
CPU = generic
CC = gcc
CFLAGS = -O2 -g -fno-strict-aliasing -Wdeclaration-after-statement -fwrapv -Wno-unused-label
OPTIONS = USE_ZLIB=1 USE_OPENSSL=1 USE_PCRE=1 USE_TFO=1 USE_NS=1
Default settings :
maxconn = 2000, bufsize = 16384, maxrewrite = 1024, maxpollevents = 200
Built with OpenSSL version : OpenSSL 1.0.2k-fips 26 Jan 2017
Running on OpenSSL version : OpenSSL 1.0.2k-fips 26 Jan 2017
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports : SSLv3 TLSv1.0 TLSv1.1 TLSv1.2
...
Разрешим входящие соединения для протокола http:
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload
Runtime directory
Поскольку HAProxy размещает pid файл в каталоге /run/haproxy
, то он не сможет запуститься пока мы его не создадим.
Обычный вызов mkdir
здесь не сработает, потому что после перезагрузки системы каталог исчезнет и его придется заново создавать,
а это не удобно. Решить эту проблему поможет systemd-tmpfiles
, который предназначен для создания временных файлов.
Создадим файл /usr/lib/tmpfiles.d/haproxy.conf
со следующим содержимым:
#Type Path Mode UID GID Age Argument
d /run/haproxy 0755 haproxy haproxy - -
Создадим runtime directory:
systemd-tmpfiles --create
Конфигурация rsyslog
Сам HAProxy не умеет писать логи в файл, давайте его научим.
mkdir -p /var/lib/haproxy/dev
touch /var/lib/haproxy/dev/log
mount --bind /dev/log /var/lib/haproxy/dev/log
Добавляем запись в /etc/fstab
, чтобы не приходилось монтировать каждый раз руками:
/dev/log /var/lib/haproxy/dev/log none defaults,bind 0 0
Убедимся, что в секции global
в файле /etc/haproxy/haproxy.cfg
присутствуют строки:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
Создадим файл конфигурации /etc/rsyslog.d/49-haproxy.conf
:
# Create an additional socket in haproxy's chroot in order to allow logging via
# /dev/log to chroot'ed HAProxy processes
$AddUnixListenSocket /var/lib/haproxy/dev/log
# Send HAProxy messages to a dedicated logfile
if $programname startswith 'haproxy' then /var/log/haproxy/haproxy.log
&~
Перезапустим rsyslog
сервис, чтобы подхватить изменения, и убедимся, что нет ошибок:
systemctl restart rsyslog
systemctl status rsyslog
Осталось только дописать в /etc/haproxy/haproxy.cfg
необходимую конфигурацию, и можно запускать сервис:
systemctl start haproxy
HAProxy® is a registered trademark in the United States and France, owned by HAProxy Technologies LLC and its affiliated entities.