HAProxy (High Availability Proxy) – популярный прокси сервер для Linux, Solaris и FreeBSD с возможностью балансировки нагрузки TCP/HTTP с открытым программным кодом. Его основная задача – повышение производительности серверной среды путем распределения рабочей нагрузки среди нескольких серверов (web, приложения, базы данных). Им пользуются такие известные проекты как GitHub, Imgur, Instagram и Twitter.
Приступим. Для начала давайте обновим репозитории и пакеты:
$ sudo apt-get update && sudo apt-get upgrade
В нашей конфигурации есть 3 сервера в локальной сети:
node1 – 192.168.1.1 – 1-ый веб-сервер
node2 – 192.168.1.2 – 2-ой веб-сервер
node3 – 192.168.1.100 – наш HAProxy
HAProxy включен в стандартные репозитории линукс, поэтому установка тревиальна:
Ubuntu/Debian:
$ sudo apt-get install haproxy
CentOS/Fedora:
$ sudo yum install haproxy
Начальная конфигурация
Конфигурация по-умолчанию находится в этом файле /etc/haproxy/haproxy.cfg, который создается автоматическй при установке пакета. В начале мы не имеем никакого load balancing:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
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
В глобальном разделе определяются параметры системного уровня, такие как расположение файлов, а также пользователь и группа, под которыми выполняется HAProxy. В большинстве случаев Вам не нужно будет ничего менять в этом разделе. Пользователь haproxy и группа haproxy создаются во время установки.
В разделе defaults определяются дополнительные параметры ведения журнала и параметры, связанные с тайм-аутами и ошибками. По умолчанию регистрируются как обычные, так и сообщения об ошибках.
Если Вы хотите отключить нормальную работу сообщений можете добавить следующее после option dontlognull:
option dontlog-normal
Вы также можете выбрать, чтобы записывать журналы ошибок в отдельных файлах:
option log-separate-errors
Конфигурация балансировки нагрузки (Load Balancing)
При настройке балансировки нагрузки с помощью HAProxy необходимо определить два типа узлов: frontend и backend. Интерфейс – это узел, с помощью которого HAProxy прослушивает соединения. Серверные узлы – это те, с помощью которых HAProxy может пересылать запросы. Третий тип узла, узел статистики, может использоваться для мониторинга подсистемы балансировки нагрузки и двух других узлов.
Откроем /etc/haproxy/haproxy.cfg в любимом тектовом редакторе и назначим фронтэнд:
frontend haproxynode
bind *:80
mode http
default_backend backendnodes
Этот блок конфигурации задает интерфейсный узел с именем haproxynode, который привязан ко всем сетевым интерфейсам и слушает порт 80. Он будет прослушивать HTTP-соединения (можно использовать режим TCP для других целей), и он будет использовать бэкэнд ноды (backendnodes).
Добавлем конфигурацию для бэкенда:
backend backendnodes
balance roundrobin
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
option httpchk HEAD / HTTP/1.1\r\nHost:localhost
server node1 192.168.1.1:80 check
server node2 192.168.1.2:80 check
Здесь мы определили backendnodes и несколько параметров конфигурации:
Параметр balance определяет стратегию балансировки нагрузки. В этом случае используется стратегия roundrobin. Эта стратегия использует каждый сервер по очереди, но позволяет назначать веса каждому серверу: серверы с более высокими весами используются чаще. Другие стратегии включают static-rr, который похож на roundrobin, но не позволяет регулировать веса на лету; и leastconn, который будет пересылать запросы на сервер с наименьшим количеством подключений.
Параметр forwardfor гарантирует, что переадресованный запрос содержит фактический IP-адрес клиента.
Первая строка http-запроса позволяет перенаправленному запросу включить порт HTTP-запроса клиента. Второй добавляет прото-заголовок, содержащий https, если ssl_fc, системная переменная HAProxy, возвращает true. Это будет иметь место, если соединение было сначала сделано через транспортный уровень SSL/TLS.
Опция httpchk определяет тип проверки, которую HAProxy использует для определения доступности. Если сервер не отвечает на определенный запрос, он не будет использоваться для балансировки нагрузки, пока не пройдет тест.
Строки server определяют фактические узлы сервера и их IP-адреса, на которые будут перенаправляться запросы. Здесь определены серверы node1 и node2, каждый из которых будет использовать определенную проверку работоспособности.
Добавим дополнительный узел статистики в конфигурацию:
listen stats
bind :5000
stats enable
stats uri /
stats hide-version
stats auth username:pa$$word
Узел HAProxy stats будет прослушивать соединения через порт 5000 и настроен на скрытие версии HAProxy, а также на требование ввода пароля. Замените пароль на более безопасный. Кроме того, рекомендуется отключить статистику входа в продакшене.
Запуск и мониторинг
Перезапустите службу HAProxy, чтобы новая конфигурация вступила в силу:
$ sudo service haproxy restart
Теперь все входящие запросы к узлу HAProxy по IP-адресу 192.168.1.100:80 будут перенаправлены на внутренний сетевой узел с IP-адресом 192.168.1.1:80 или 192.168.1.2:80. Эти серверные узлы будут обслуживать HTTP-запросы. Если в какой-либо момент один из этих узлов не проходит проверку работоспособности, он не будут использоваться для обслуживания каких-либо запросов, пока не пройдут тест.
Для просмотра статистики и мониторинга работоспособности узлов перейдите к IP-адресу или доменному имени интерфейсного узла в веб-браузере по назначенному порту, например, http://192.168.1.100:5000. Страница будет отображать статистику, такую как: количество раз, когда запрос был переадресован на определенный узел, а также количество текущих и предыдущих сеансов, обработанных фронтенд-узлом.
Вы можете обратиться к следующим ресурсам для получения дополнительной информации по этой теме. Хотя они предоставляются в надежде, что они будут полезны, обратите внимание, что мы не можем ручаться за точность или своевременность материалов, размещенных на внешних сайтах.
