Компиляция и установка HAProxy на CentOS 7 из исходников

К сожалению, в CentOS 7 и других RHEL-based системах в репозиториях выложены только древние версии haproxy. Производителем эти ветки уже не поддерживаются, и возможно, силами Red Hat в них и интегрируются патчи безопасности, но уж никаких новых возможностей точно не прибавляется. А продукт тем временем развивается и улучшается и нам, конечно же, хотелось бы воспользоваться последней версией haproxy.

Итак, идём на страницу https://github.com/philyuchkoff/HAProxy-2-RPM-builder и выполняем все инструкции оттуда.
Продублирую здесь то, что было сделано для установки версии Haproxy 2.2.2

yum install -y make gcc perl pcre-devel zlib-devel git
или полностью
yum groupinstall 'Development Tools'

cd /opt
git clone https://github.com/philyuchkoff/HAProxy-2-RPM-builder.git
cd ./HAProxy-2-RPM-builder
vi Makefile

Здесь нужно отредактировать параметр MAINVERSION. Была указана ветка 2.1, я поправил на 2.2

MAINVERSION=2.2

Продолжаем:

git checkout master
make

Собранный RPM будет лежать в папке /opt/HAProxy-2-RPM-builder/rpmbuild/RPMS/x86_64/

Похоже, что скрипт компиляции сохраняет в папке только последнюю версию RPM-а, а всё предыдущее вычищает. При необходимости – сохранить предыдущую версию в другую папку!

Устанавливаем собранный RPM:

cd /opt/HAProxy-2-RPM-builder/rpmbuild/RPMS/x86_64/
yum -y localinstall haproxy-2.2.2-1.el7.x86_64.rpm

После установки сервис haproxy у меня не запускался, и в journalctl -xe ругается [ALERT] 093/083850 (73356) : Starting frontend GLOBAL: cannot bind UNIX socket [/var/lib/haproxy/stats]
Пришлось создать каталоги и файл статистики Haproxy вручную по другой статье из Интернета (раньше оно как-то само создавалось):

mkdir -p /var/lib/haproxy 
touch /var/lib/haproxy/stats

После этого необходимо заполнить haproxy.cfg, т.к. в данном случае он создаётся практически пустым и неработоспособным.
Для начала можно обойтись разделами global, defaults и запустить раздел stats:

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
    stats socket 127.0.0.1:14567

    #-- hardening SSL, don't allow weak and insecure ciphers
      tune.ssl.default-dh-param 2048

      ssl-default-bind-options no-sslv3 no-tlsv11 no-tls-tickets        #we have to let TLS v1.0 for OutlookAnywhere @ Windows7
      ssl-default-bind-ciphers ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS

      ssl-default-server-options no-sslv3 no-tlsv11 no-tls-tickets        #we have to let TLS v1.0 for OutlookAnywhere @ Windows7
      ssl-default-server-ciphers ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
        compression algo gzip
        compression type text/html text/plain
    log                     global
    #option                  log-separate-errors
    #option                  httplog
    option                  dontlognull
   #option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

    log-format %ci:%cp->%fi:%fp\ %bi:%bp->%si:%sp\ [%Tl]\ %ft\ %b/%s\ %Tq/%Tw/%Tc/%Tr/%Tt\ %ST\ %B\ %CC\ %CS\ %tsc\ %ac/%fc/%bc/%sc/%rc\ %sq/%bq\ %hr\ %hs\ %{+Q}r


listen stats
    bind *:10001
    acl admin_ips src 10.1.128.0/24 10.1.129.0/24 10.1.130.0/24 172.16.0.0/16 10.197.2.0/24
    http-request deny if !admin_ips
    stats enable
    stats hide-version
    stats uri /stats

Этого должно быть достаточно, чтобы сервис запустился и показал страничку статистики.
В новой версии rsyslog настраивать не нужно, Haproxy уже из коробки пишет логи в папку /var/log/haproxy/

Другие статьи по установке из исходников:

https://gist.github.com/meanevo/742b61031fdf9ce01e50d4b196a3f31e
https://tylersguides.com/guides/installing-haproxy-from-source-on-centos-8/
https://www.bantrain.com/how-to-install-haproxy-2-0-in-amazon-linux-2-centos-rhel/

Настройка Haproxy

конфиг:

vi /etc/haproxy/haproxy.cfg

валидация конфига:

haproxy -c -V -f /etc/haproxy/haproxy.cfg

Chroot:

В новых версиях haproxy по-умолчанию включена опция chroot. Опция весьма полезная, чтобы она заработала нужно создать папку /etc/haproxy/chroot и назначить права на неё:

mkdir /etc/haproxy/chroot
chmod -R 770 /etc/haproxy/chroot

настройка логирования для haproxy:

В версиях выше 2.2 это делать не нужно, логи автоматически сохраняются в папку /var/log/haproxy/

vi /etc/rsyslog.conf
раскомментировать строки:
	$ModLoad imudp
	$UDPServerRun 514
добавить строку, чтобы получить логи только с локального хоста:
	$UDPServerAddress 127.0.0.1
добавить строки в секцию RULES в самое начало:
	# HAProxy logs
	local2.*                       /var/log/haproxy.log
	& stop
перезапустить демон rsyslog:
	service rsyslog restart

минимальный конфиг для запуска:

global
    #log /dev/log    local0
    #log /dev/log    local1 notice
    log         127.0.0.1 local2
    chroot /etc/haproxy/chroot
    #stats socket /run/haproxy/admin.sock mode 660 level admin
    stats socket 127.0.0.1:14567
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log     global
    mode    http
        compression algo gzip
        compression type text/html text/plain
    #option  httplog
    option  dontlognull
    option  redispatch
    retries 3
    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

    log-format [%Tl]\ %ci:%cp->%fi:%fp\ %bi:%bp->%si:%sp\ %ft\ %b/%s\ %Tq/%Tw/%Tc/%Tr/%Tt\ %ST\ %B\ %CC\ %CS\ %tsc\ %ac/%fc/%bc/%sc/%rc\ %sq/%bq\ %hr\ %hs\ %{+Q}r

listen stats
    bind *:10001
    mode http
    acl admin_ips src 10.1.128.0/24 10.1.129.0/24 172.16.0.0/16 192.168.77.0/24
    http-request deny if !admin_ips
    #stats admin if admin_ips
    stats enable
    #stats realm Haproxy\ Statistics  # Title text for popup window
    stats uri /stats
    #stats hide-version

запуск:

systemctl enable haproxy
systemctl start haproxy

/etc/haproxy/html_static/stub.html

В новых версиях haproxy не может отдавать просто html-страницы, нужно создавать специальные веб-страницы с http-заголовками.
Поэтому stub-страница, которую мы будем возвращать при непопадании ни в один из бэкендов, будет выглядеть так:

HTTP/1.1 200
Cache-Control: no-cache
Connection: close
Content-Type: text/plain
Retry-After: 60

stub

Репозиторий с пакетами установки:
https://bodhi.fedoraproject.org/updates/?packages=haproxy

wget -O /tmp/haproxy-2.2.2-1.fc33.x86_64.rpm https://kojipkgs.fedoraproject.org/packages/haproxy/2.2.2/1.fc33/x86_64/haproxy-2.2.2-1.fc33.x86_64.rpm
yum -y localinstall /tmp/haproxy-2.2.2-1.fc33.x86_64.rpm

MEMO

https://serveradmin.ru/nastroyka-dns-servera-bind-v-centos-7/
yum install -y bind bind-utils bind-chroot
vi /var/named

mkdir /var/log/named
chown named /var/log/named/
systemctl enable named
systemctl start named

    named-checkconf