Понадобился простой tcp прокси который на фронтенде слушает обращения по портам tcp/80,443 и перенаправляет их в сторону AWS.
В качестве адреса бэкенда используется доменное имя, А-записи которого указывают на ip адреса Амазона. TTL А-записи составляет 5 секунд.
Прокси сделали одноногоним.
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
Идем в настройки и видим симлинк.
[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
Приводим конфиг к виду.
Секция 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 и проверяем работу.