Table of Contents

Установка HAProxy на Centos7

Понадобился простой tcp прокси который на фронтенде слушает обращения по портам tcp/80,443 и перенаправляет их в сторону AWS.
В качестве адреса бэкенда используется доменное имя, А-записи которого указывают на ip адреса Амазона. TTL А-записи составляет 5 секунд.
Прокси сделали одноногоним.

Установка HAProxy

Установка коротко

yum install centos-release-scl
yum install rh-haproxy18-haproxy rh-haproxy18-haproxy-syspaths
systemctl start rh-haproxy18-haproxy
systemctl enable rh-haproxy18-haproxy

Установка подробнее

В дефолтном репозитории base была только старая версия 1.5.18-8.el7 для которой выпускаются только «Critical fixes only» обновления (http://www.haproxy.org/).
Из репозитория SCL будем ставить версию 1.8, которая в настоящее время имеет статус «Stable version (LTS)».

Подключаем репозиторий SCL.

[root@hap2 ~]# yum install centos-release-scl

Ставим необходимые пакеты.

[root@hap2 ~]# yum install rh-haproxy18-haproxy rh-haproxy18-haproxy-syspaths

...

Dependencies Resolved

==========================================================================================================================
 Package                                                         Arch                                     Version                                            Repository                                        Size
==========================================================================================================================
Installing:
 rh-haproxy18-haproxy                                            x86_64                                   1.8.4-3.el7                                        centos-sclo-rh                                   1.2 M
 rh-haproxy18-haproxy-syspaths                                   x86_64                                   1.8.4-3.el7                                        centos-sclo-rh                                   3.8 k
Installing for dependencies:
 audit-libs-python                                               x86_64                                   2.8.4-4.el7                                        base                                              76 k
 checkpolicy                                                     x86_64                                   2.5-8.el7                                          base                                             295 k
 libcgroup                                                       x86_64                                   0.41-20.el7                                        base                                              66 k
 libsemanage-python                                              x86_64                                   2.5-14.el7                                         base                                             113 k
 policycoreutils-python                                          x86_64                                   2.5-29.el7_6.1                                     updates                                          456 k
 python-IPy                                                      noarch                                   0.75-6.el7                                         base                                              32 k
 rh-haproxy18-runtime                                            x86_64                                   3.1-2.el7                                          centos-sclo-rh                                   1.1 M
 scl-utils                                                       x86_64                                   20130529-19.el7                                    base                                              24 k
 setools-libs                                                    x86_64                                   3.3.8-4.el7                                        base                                             620 k

...

Запускаем и включаем автозагрузку.

[root@hap2 ~]# systemctl start rh-haproxy18-haproxy
[root@hap2 ~]# systemctl enable rh-haproxy18-haproxy

Systemd файл, в ExecStartPre можно подсмотреть как проверить конфигурацию HAProxy.

[root@hap2 ~]# cat /usr/lib/systemd/system/rh-haproxy18-haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=network.target

[Service]
Environment="CONFIG=/etc/opt/rh/rh-haproxy18/haproxy/haproxy.cfg" "PIDFILE=/run/rh-haproxy18-haproxy.pid"
EnvironmentFile=/etc/sysconfig/rh-haproxy18-haproxy
ExecStartPre=/opt/rh/rh-haproxy18/root/usr/sbin/haproxy -f $CONFIG -c -q
ExecStart=/opt/rh/rh-haproxy18/root/usr/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE $OPTIONS
ExecReload=/opt/rh/rh-haproxy18/root/usr/sbin/haproxy -f $CONFIG -c -q
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
Type=notify

[Install]
WantedBy=multi-user.target

Настройка HAProxy

Идем в настройки и видим симлинк.

[root@hap2 ~]# cd /etc/haproxy/
[root@hap2 haproxy]# ll
total 0
lrwxrwxrwx 1 root root 44 апр 17 17:26 haproxy.cfg -> /etc/opt/rh/rh-haproxy18/haproxy/haproxy.cfg

Сохраняем дефолтный конфиг.

[root@hap2 haproxy]# cd /etc/opt/rh/rh-haproxy18/haproxy/
[root@hap2 haproxy]# cp haproxy.cfg haproxy.cfg.orig

Приводим конфиг к виду.

Простая конфигурация haproxy

Простая конфигурация haproxy

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

    chroot      /var/opt/rh/rh-haproxy18/lib/haproxy
    pidfile     /var/run/rh-haproxy18-haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/opt/rh/rh-haproxy18/lib/haproxy/stats

    # utilize system-wide crypto-policies
    ssl-default-bind-ciphers PROFILE=SYSTEM
    ssl-default-server-ciphers PROFILE=SYSTEM

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    tcp
    log                     global
#    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

#---------------------------------------------------------------------
# STATS
#---------------------------------------------------------------------
frontend FE-STATS
    bind 1.2.3.4:38282
    mode http
    stats enable
    stats hide-version
    stats show-legends    
    stats show-node
    stats auth username:superpassword
    stats uri /stats
#    stats realm LoadBalancer_statistics

#---------------------------------------------------------------------
# FRONTEND section
#---------------------------------------------------------------------
frontend FE-MAIN-TCP80
    bind 1.2.3.4:80
    option tcplog
    default_backend             BE-MAIN-TCP80

frontend FE-MAIN-TCP443
    bind 1.2.3.4:443
    option tcplog
    default_backend             BE-MAIN-TCP443


#---------------------------------------------------------------------
# BACKEND section
#---------------------------------------------------------------------
backend BE-MAIN-TCP80
    balance     roundrobin
    server      BE1 some-domain-name.ru:80 resolvers DNS-SERVERS

backend BE-MAIN-TCP443
    balance     roundrobin
    server      BE1 some-domain-name.ru:443 resolvers DNS-SERVERS

#---------------------------------------------------------------------
# RESOLVERS section
#---------------------------------------------------------------------
resolvers DNS-SERVERS
    nameserver NS1 ns-1094.awsdns-08.org:53
    nameserver NS2 ns-1698.awsdns-20.co.uk:53
    nameserver NS3 ns-338.awsdns-42.com:53
    nameserver NS4 ns-978.awsdns-58.net:53
    nameserver NS5 9.9.9.10:53
    resolve_retries 1
    timeout retry   1s
    hold valid    2s


Секция global.

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

    chroot      /var/opt/rh/rh-haproxy18/lib/haproxy
    pidfile     /var/run/rh-haproxy18-haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/opt/rh/rh-haproxy18/lib/haproxy/stats

    # utilize system-wide crypto-policies
    ssl-default-bind-ciphers PROFILE=SYSTEM
    ssl-default-server-ciphers PROFILE=SYSTEM

Параметры:

Секция defaults.
Дефолтные параметры фронтентов и бэкендов.

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    tcp
    log                     global
#    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

Параметры:

Секция статистики.
HAProxy может отдавать свою статиститку.

---------------------------------------------------------------------
# STATS
#---------------------------------------------------------------------
frontend FE-STATS
    bind 1.2.3.4:38282
    mode http
    stats enable
    stats hide-version
    stats show-legends    
    stats show-node
    stats auth username:superpassword
    stats uri /stats
#    stats realm LoadBalancer_statistics

Параметры:
  * bind - адрес и порт на котором будет доступна статисктика
  * mode - режим работы, в данном случае должен быть http. 
  * stats enable - включаем статистику.
  * stats hide-version - прячем версию HAProxy. 
  * stats auth - логин и пароль в открытом виде. 

Секция frontend.

#---------------------------------------------------------------------
# FRONTEND section
#---------------------------------------------------------------------
frontend FE-MAIN-TCP80
    bind 1.2.3.4:80
    option tcplog
    default_backend             BE-MAIN-TCP80

frontend FE-MAIN-TCP443
    bind 1.2.3.4:443
    option tcplog
    default_backend             BE-MAIN-TCP443

Параметры:

Секция backend.

#---------------------------------------------------------------------
# BACKEND section
#---------------------------------------------------------------------
backend BE-MAIN-TCP80
    balance     roundrobin
    server      BE1 some-domain-name.ru:80 resolvers SOME-DNS-SERVERS

backend BE-MAIN-TCP443
    balance     roundrobin
    server      BE1 some-domain-name.ru:443 resolvers SOME-DNS-SERVERS

Параметры:

Секция resolvers.
HAProxy резолвит доменное имя бэкенда только при старте и не умеет следить за TTL записи.
Решение, это настроить секцию resolvers и сказать HAProxy какие днс сервера опрашивать и как часто.
В нашем случае у записи TTL равно 5 секудам. Опрашивать будем все днс сервера отвечающие за зону (NS1-NS4) и один публичный резолвер (NS5).
HAProxy будет использовать ip адрес из первого пришедшего валидного ответа.

#---------------------------------------------------------------------
# RESOLVERS section
#---------------------------------------------------------------------
resolvers SOME-DNS-SERVERS
    nameserver NS1 ns-1094.awsdns-08.org:53
    nameserver NS2 ns-1698.awsdns-20.co.uk:53
    nameserver NS3 ns-338.awsdns-42.com:53
    nameserver NS4 ns-978.awsdns-58.net:53
    nameserver NS5 9.9.9.10:53
    resolve_retries 1
    timeout retry   1s
    hold valid    2s

Параметры:

Все, после этого запускаем HAProxy и проверяем работу.


Полезные ссылки