Простая настройка HAProxy как балансировщика веб-серверов (Load Balancing)

HAProxy

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

Вы можете обратиться к следующим ресурсам для получения дополнительной информации по этой теме. Хотя они предоставляются в надежде, что они будут полезны, обратите внимание, что мы не можем ручаться за точность или своевременность материалов, размещенных на внешних сайтах.


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Unlix © Все права защищены 2019

Копирование материалов с сайта Unlix.ru без указания полной ссылки на источник ЗАПРЕЩЕНО!