Как настроить HAProxy в качестве балансировщика нагрузки для Nginx на CentOS 8
Для обеспечения максимальной доступности веб-приложений, масштабируемости и высокой производительности теперь обычно используют технологии, которые вводят избыточность, такие как кластеризация серверов и балансировка нагрузки. Например, настройка кластера серверов, на которых все запускают одно и то же приложение(я), и затем развертывание балансировщика(ей) нагрузки перед ними для распределения трафика.
HAProxy — это открытый, мощный, высокопроизводительный, надёжный, безопасный и широко используемый балансировщик нагрузки с высокой доступностью для TCP/HTTP, прокси-сервер и терминатор SSL/TLS, созданный для веб-сайтов с очень высоким трафиком. Он стабильно работает на операционных системах Linux, Solaris, FreeBSD, OpenBSD, а также AIX.
Это руководство показывает, как настроить выделенный высокодоступный балансировщик нагрузки с HAProxy на CentOS 8 для управления трафиком в кластере веб-серверов NGINX. Также в нем демонстрируется, как настроить SSL/TLS терминацию в HAProxy.
Предпосылки :
Всего 4 сервера с минимальной установкой CentOS 8.
Настройка тестовой среды
----------- HAProxy Server Setup -----------
HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247
Test Site Domain: www.tecmint.lan
----------- Client Web Servers Setup -----------
Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200
Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21
Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34
Шаг 1: Настройка HTTP-сервера Nginx на клиентских машинах
1. Войдите на все ваши клиентские машины CentOS 8 и установите веб-сервер Nginx с помощью менеджера пакетов dnf, как показано.
# dnf install Nginx
2. Далее запустите службу Nginx, на данный момент включите её автоматический запуск при загрузке системы и убедитесь, что она работает, проверив её статус с помощью команд systemctl (сделайте это на всех клиентских машинах).
# systemctl start nginx
# systemctl enable nginx
# systemctl status nginx
3. Кроме того, если служба firewalld запущена на всех клиентских машинах (что можно проверить, выполнив systemctl start firewalld), необходимо добавить в конфигурацию брандмауэра службы HTTP и HTTPS, чтобы запросы от балансировщика нагрузки проходили через брандмауэр к веб-серверам Nginx. Затем перезапустите службу firewalld, чтобы изменения вступили в силу (сделайте это на всех клиентских машинах).
# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent --add-service=https
# firewall-cmd --reload
4. Далее откройте веб-браузер на своих локальных устройствах и проверьте, работает ли установка Nginx корректно. Используйте IP-адреса клиентов для перехода, как только вы увидите тестовую страницу Nginx, это означает, что веб-сервер, установленный на клиентской машине, работает правильно.
5. Далее нам нужно создать тестовые страницы на клиентских компьютерах, которые мы будем использовать позже для проверки настройки HAProxy.
----------- Web Server #1 -----------
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html
----------- Web Server #2 -----------
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html
----------- Web Server #3 -----------
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html
Шаг 2: Установка и настройка сервера HAProxy на CentOS 8
6. Теперь установите пакет HAProxy на сервер HAProxy, выполнив следующую команду.
# dnf install haproxy
7. Далее запустите службу HAProxy, включите её автозапуск при включении системы и проверьте её статус.
# systemctl start haproxy
# systemctl enable haproxy
# systemctl status haproxy
8. Теперь мы настроим HAProxy, используя следующий конфигурационный файл.
# vi /etc/haproxy/haproxy.cfg
Файл конфигурации разделен на четыре основных раздела.
- глобальные настройки - задаёт параметры всего процесса.
- defaults - этот раздел устанавливает параметры по умолчанию для всех других разделов, следующих после его объявления.
- frontend - этот раздел описывает набор прослушивающих сокетов, принимающих соединения клиентов.
- Бэкенд - этот раздел описывает набор серверов, к которым прокси будет подключаться для пересылки входящих соединений.
Чтобы понять варианты в разделе глобальные настройки и по умолчанию, прочитайте документацию HAProxy (ссылка приведена в конце статьи). Для этого руководства мы будем использовать настройки по умолчанию.
Настройка ведения логов HAProxy
9. HAProxy, один раз развернутый, будет играть значительную роль в вашей IT-инфраструктуре, поэтому настройка логирования для него является основным требованием; это позволяет получать информацию о каждом соединении с вашими бекенд-веб-серверами.
Параметр log (выделен на следующем скриншоте) объявляет глобальный сервер Syslog (например, rsyslog, используемый по умолчанию в CentOS), который будет получать сообщения журнала. Здесь можно объявить более одного сервера.
Конфигурация по умолчанию указывает на localhost (127.0.0.1), а local2 является кодом службы по умолчанию, используемым для идентификации сообщений журнала HAProxy в rsyslog.
10. Далее вам нужно рассказать серверу rsyslog, как получать и обрабатывать лог-сообщения HAProxy. Откройте файл конфигурации rsyslog по пути /etc/rsyslog.conf или создайте новый файл в директории /etc/rsyslog.d, например /etc/rsyslog.d/haproxy.conf.
# vi /etc/rsyslog.d/haproxy.conf
Скопируйте и вставьте следующую конфигурацию, чтобы собирать логи с помощью UDP на порту по умолчанию 514.
$ModLoad imudp
$UDPServerAddress 127.0.0.1
$UDPServerRun 514
Также добавьте эти строки, чтобы указать rsyslog записывать в два отдельных файла журналов в зависимости от уровня серьезности, где local2 — это код службы, определенный в приведенной выше конфигурации HAProxy.
local2.* /var/log/haproxy-traffic.log
local2.notice /var/log/haproxy-admin.log
11. Сохраните файл и закройте его. Затем перезапустите службу rsyslog, чтобы применить последние изменения.
# systemctl restart rsyslog
Настройка фронтенда и бэкендов HAProxy
12. В этом разделе мы покажем, как настроить фронтенд и бэкенд прокси. Вернитесь к файлу конфигурации HAProxy и измените стандартные секции фронтенда и бэкенда следующим образом. Мы не будем подробно объяснять каждый параметр, вы всегда можете обратиться к официальной документации.
Следующая конфигурация определяет секцию listen, используемую для отображения страницы HAProxy Stats. Параметр bind назначает слушателя на заданный IP-адрес (* для всех в данном случае) и порт (9000).
Параметр enable в настройках stats включает страницу статистики, к которой можно получить доступ, используя URI /stats (т.е. http://server_ip:9000/stats).
Настройка stats auth используется для добавления базовой аутентификации при доступе к странице (замените haproxy и Lostp@1ss на имя пользователя и пароль по вашему выбору).
listen stats
bind *:9000
stats enable
stats hide-version
stats uri /stats
stats admin if LOCALHOST
stats auth haproxy:Lostp@1ss
13. Следующая конфигурация определяет секцию frontend под названием TL (вы можете дать имя по вашему желанию). Параметр mode определяет режим, в котором работает HAProxy.
Параметр acl (Список управления доступом) используется для принятия решения на основе содержимого, извлечённого из запроса. В этом примере запрос считается обычным HTTP, если он не сделан через SSL.
Затем настройка http-request set-header используется для добавления HTTP-заголовка к запросу. Это помогает информировать Nginx о том, что исходный запрос был выполнен через HTTP (или через порт 80).
Директива default_backend или use_backend определяет серверы бэкенда, в данном случае упомянутые как TL_web_servers.
Обратите внимание, что HAProxy вернёт “ошибку 503 Service Unavailable”, если запрос не маршрутизирован с помощью директивы use_backend или default_backend.
frontend TL
bind *:80
mode http
acl http ssl_fc,not
http-request set-header X-Forwarded-Protocol http if http
default_backend TL_web_servers
14. Затем нам нужно определить секцию бэкенда, где параметр balance определяет, как HAProxy выбирает серверы бэкенда для обработки запроса, если никакой метод сохранения состояния не переопределяет этот выбор.
Директива cookie включает постоянство на основе cookie, она указывает HAProxy отправлять клиенту cookie с именем SERVERID и связывать его с ID сервера, который дал первоначальный ответ.
Директива server используется для определения upstream-серверов в формате server_name (например, websrv1), server_IP:port и options.
Одним из ключевых параметров является check, который указывает HAProxy продолжать проверку доступности сервера и отображать информацию на странице статистики.
backend TL_web_servers
mode http
balance roundrobin
option httpchk HEAD /
cookie SERVERUID insert indirect nocache
server websrv1 10.42.0.200:80 cookie websrv1 check
server websrv2 10.42.0.21:80 cookie websrv2 check
server websrv3 10.42.0.34:80 cookie websrv3 check
Закомментируйте все остальные секции фронтенда и бэкенда, как показано на следующем скриншоте. Сохраните файл и закройте его.
15. Теперь перезапустите сервис HAProxy, чтобы применить новые изменения.
# systemctl restart haproxy
16. Далее убедитесь, что службы HTTP (порт 80) и HTTPS (порт 433) открыты в брандмауэре для приёма запросов от клиентов следующим образом. Также откройте порт 9000 в брандмауэре для доступа к странице статистики и перезагрузите настройки брандмауэра.
# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent -add-service=https
# firewall-cmd --zone=public --permanent --add-port=9000/tcp
# firewall-cmd --reload
Шаг 3: Тестирование настройки HAProxy и просмотр статистики
17. Теперь пора протестировать настройку HAPrxoy. На локальном рабочем компьютере, с которого вы получаете доступ ко всем серверам, добавьте следующую строку в файл /etc/hosts, чтобы мы могли использовать домен фиктивного сайта.
10.42.0.247 www.tecmint.lan
18. Затем откройте браузер и перейдите по адресу сервера или домену сайта.
http://10.42.0.247/
OR
http://www.tecmint.lan/
19. Чтобы получить доступ к странице статистики HAProxy, используйте следующий адрес.
http://10.42.0.247:9000/stats
Затем используйте имя пользователя и пароль, которые вы указали в конфигурационном файле HAProxy (см. параметр stats auth).
После успешного входа в систему вы попадёте на страницу статистики HAProxy, которая показывает показатели, охватывающие состояние ваших серверов, текущие скорости запросов, время отклика и многое другое.
Чтобы продемонстрировать, как работает отчет о состоянии в отношении цветовых кодов, мы разместили один из серверов задней части.
Шаг 4: Настройка HTTPS в HAProxy с использованием самоподписанного SSL-сертификата
20. В этом заключительном разделе мы покажем, как настроить SSL/TLS для защиты всех коммуникаций между сервером HAProxy и клиентом. HAProxy поддерживает четыре основных режима конфигурации HTTPS, но для этого руководства мы будем использовать разгрузку SSL/TLS.
В режиме SSL/TLS разгрузки, HAProxy расшифровывает трафик на стороне клиента и подключается к серверам backend в открытом виде трафика.
Мы начнем с создания сертификата и ключа, как показано (отвечайте на вопросы соответственно, основываясь на данных вашей компании при создании сертификата, как выделено на скриншоте).
# mkdir /etc/ssl/tecmint.lan
# cd /etc/ssl/tecmint.lan/
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt
# cd /etc/ssl/tecmint.lan/
# cat tecmint.crt tecmint.key >tecmint.pem
# ls -l
21. Затем откройте файл конфигурации HAProxy (/etc/haproxy/haproxy.cfg) и отредактируйте секцию front-end.
frontend TL
bind *:80
bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem
redirect scheme https if !{ ssl_fc }
mode http
acl http ssl_fc,not
acl https ssl_fc
http-request set-header X-Forwarded-Protocol http if http
http-request set-header X-Forwarded-Protocol https if https
default_backend TL_web_servers
Сохраните файл и закройте его.
22. Затем перезапустите службу HAProxy, чтобы применить новые изменения.
# systemctl restart haproxy.service
23. Далее откройте веб-браузер и попробуйте снова получить доступ к сайту. Браузер покажет ошибку из-за самоподписанного сертификата, нажмите Дополнительно, чтобы продолжить.
На этом пока всё! У каждого веб-приложения есть свой набор требований, вам нужно разрабатывать и настраивать балансировку нагрузки в соответствии с вашей IT-инфраструктурой и требованиями приложения.
Чтобы получить больше информации о некоторых параметрах настройки, используемых в этом руководстве, и в целом о том, как использовать HAProxy, смотрите официальную документацию HAProxy community edition или документацию версии HAProxy enterprise. Вы можете отправить любые вопросы или мысли через форму обратной связи ниже.











