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. Страница будет отображать статистику, такую как: количество раз, когда запрос был переадресован на определенный узел, а также количество текущих и предыдущих сеансов, обработанных фронтенд-узлом.
Вы можете обратиться к следующим ресурсам для получения дополнительной информации по этой теме. Хотя они предоставляются в надежде, что они будут полезны, обратите внимание, что мы не можем ручаться за точность или своевременность материалов, размещенных на внешних сайтах.