Как настроить балансировщик нагрузки 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