Поиск по сайту:

Как настроить балансировщик нагрузки HAProxy


HAProxy — это балансировщик нагрузки с открытым исходным кодом, способный балансировать любую службу на основе TCP. Он обычно используется для балансировки HTTP и может помочь решить проблемы с трафиком на вашем веб-сервере. Вот как это настроить.

Что такое HAProxy?

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

HAProxy также позволяет вашей сети быть более устойчивой. Если один веб-сервер выходит из строя, HAProxy может перенаправить трафик на остальные, пока вы диагностируете проблему. Чтобы он был по-настоящему устойчивым, вам понадобится резервный сервер HAProxy на случай, если ваш балансировщик нагрузки выйдет из строя.

Даже с HAProxy вам все равно часто понадобится перед ним полный CDN сайта, как для обработки дополнительной нагрузки, так и для того, чтобы иметь несколько точек присутствия ближе к конечному пользователю.

Как настроить балансировку нагрузки HAProxy

Сначала установите HAProxy из менеджера пакетов вашего дистрибутива. Для систем на основе Debian, таких как Ubuntu, это будет:

apt-get install haproxy

Затем вам нужно включить его, отредактировав сценарий инициализации в /etc/default/haproxy и установив для ENABLED значение 1:

ENABLED=1

Теперь, если вы запустите service haproxy, вы увидите, что он включен и готов к настройке. Мы начнем с архивации файла конфигурации по умолчанию:

mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.old

Создайте вместо него новый файл конфигурации и начните с добавления нескольких глобальных настроек:

global
    log 127.0.0.1 local0 notice
    maxconn 2000
    user haproxy
    group haproxy
    stats enable
    stats uri /haproxy?stats
    stats realm HAProxy Statistics
    stats auth admin:password

Параметр log указывает сервер системного журнала, на который HAProxy отправляет журналы. Вам понадобится сервер, например rsyslog, чтобы использовать это. Параметр maxconn указывает максимальное количество одновременных подключений, а user и group определяют, от имени какого пользователя Unix работает HAProxy.

Последние несколько строк включают встроенную страницу статистики HAProxy, которую вы можете просмотреть, перейдя по URI в своем браузере. В данном случае это будет http://your_ip/haproxy?stats, но вы можете просмотреть его демонстрацию здесь.

Далее мы установим конфигурацию по умолчанию, которая будет применяться ко всем блокам listen, если они не будут вносить в нее никаких изменений:

defaults
    log global
    mode http
    option httplog
    option dontlognull
    retries 3
    option redispatch
    timeout connect 5000
    timeout client 10000
    timeout server 10000

Мы устанавливаем по умолчанию использование глобальной настройки журнала, работу по HTTP и устанавливаем некоторые настройки, связанные с тайм-аутами соединения.

Мы создадим блок frontend, который будет выполнять тяжелую работу и перенаправлять соединения на серверную часть:

frontend proxy
    bind *:80

    # ACL function declarations
    acl is_abuse src_http_req_rate(Abuse) ge 10 
    acl inc_abuse_cnt src_inc_gpc0(Abuse) gt 0 
    acl abuse_cnt src_get_gpc0(Abuse) gt 0

    # Rules
    tcp-request connection track-sc0 src table Abuse
    tcp-request connection reject if abuse_cnt
    http-request deny if abuse_cnt
    http-request deny if is_abuse inc_abuse_cnt

    option httpclose
    option forwardfor

    use_backend appname

Первая строка привязывает этот интерфейс к порту 80, где HAProxy будет слушать.

Следующие два раздела предназначены для ограничения скорости. Во-первых, объявляются функции списка управления доступом (ACL), которые определяют, является ли IP-адрес неправомерным. Затем набор правил отклонит соединение, если оно делает слишком много запросов.

Параметр forwardfor перенаправляет IP-адрес клиента на сервер. Поскольку HAProxy действует как обратный прокси-сервер, ваш сервер nginx будет видеть только IP-адрес вашего сервера HAProxy. Этот параметр устанавливает заголовок HTTP X-Forwarded-For для IP-адреса клиента.

И, наконец, мы устанавливаем этот блок frontend для использования серверного «имя приложения», которое нам нужно создать. Блок backend просто определяет серверы для пересылки, а также несколько параметров:

backend appname your_ip:80
    balance roundrobin
    cookie SERVERNAME insert
    server web1 web1_ip:80 check cookie web1
    server web2 web2_ip:80 check cookie web2

Директива balance определяет, как HAProxy балансирует запросы между серверами. Наиболее распространенным вариантом является roundrobin, который будет чередовать соединения через каждый сервер по порядку. Если у вас возникли проблемы с балансом, вы можете попробовать использовать параметр leastconn, который выбирает на основе одновременных подключений. Если вам нужно, чтобы пользователи обращались к одному и тому же серверу через несколько подключений, вы можете использовать параметр source, который выбирает на основе хэша IP-адреса клиента.

Последние две строки выделяют серверы для этого блока listen . Вы даете им имя (web1 и web2), указываете их адреса, а затем перечисляете несколько вариантов. Здесь мы используем параметр check, чтобы убедиться, что сервер исправен и принимает подключения, а параметр cookie — для установки файла cookie SERVERNAME (который мы вставили прямо выше) к имени сервера, который используется для закрепления сеанса (чтобы пользователь не переключал серверы при использовании вашего сайта). Такой же эффект достигается с помощью параметра balance source.

И поскольку мы используем ограничение скорости, нам действительно понадобится еще один сервер для хранения IP-адресов:

backend Abuse
    stick-table type ip size 100K expire 30m store gpc0,http_req_rate(10s)

На самом деле это не перенаправляет никаких соединений; он функционирует как таблица для хранения адресов. Адреса сбрасываются через 30 минут, поэтому адреса, которые считаются оскорбительными, будут заблокированы на 30 минут.

Наконец, вы можете запустить службу HAProxy, запустив:

service haproxy start