null

Сборка и установка HAProxy на CentOS 7

В этой заметке мы соберем из исходного кода и установим свежий 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.