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
Приводим конфиг к виду.
Секция 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
Параметры:
- maxconn - количество одновременных сессий который готов обработать haproxy.
- log - указываем syslog фасилити.
Секция 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
Параметры:
- mode - режим работы прокси.
- log - берем настройки логирования из секции global.
- maxxconn - количество одновременных сессий у каждого фронтенда или бэкенда.
Секция статистики.
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
Параметры:
- bind - адрес и порт фронтенда.
- option tcplog - включаем логирование.
- default_backend - указываем какой бэкенд использовать.
Секция 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
Параметры:
- balance - метод балансировки, в данном случае без разницы какой, бэкенд всего один.
- server - указываем доменное имя бэкенда и говорим с помощью каких днс серверов резолвить.
Секция 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
Параметры:
- resolve_retries - количество попыток сделать днс запрос.
- timeout retry - через сколько времени повторить запрос если был получен не валидный ответ.
- hold valid - сколько времени “держать в памяти” валидный ответ, фактически это частота опроса днс серверов в штатном режиме.
Все, после этого запускаем HAProxy и проверяем работу.
