Как настроить HAProxy в качестве балансировщика нагрузки для Nginx на CentOS 8

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

HAProxy – это бесплатный, мощный, высокопроизводительный, надежный, безопасный и широко используемый высокодоступный TCP/HTTP балансировщик нагрузки, прокси-сервер и терминатор SSL/TLS, разработанный для веб-сайтов с очень высоким трафиком. Он работает надежно на Linux, Solaris, FreeBSD, OpenBSD а также на операционных системах AIX.

В этом руководстве показано, как настроить выделенный высокодоступный балансировщик нагрузки с HAProxy на CentOS 8 для управления трафиком в кластере NGINX веб-серверов. Также демонстрируется, как настроить SSL/TLS завершение в HAProxy.

Необходимые условия:

A total of 4 servers with minimal CentOS 8 installation.

Настройка тестовой среды

----------- 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: Настройка Nginx HTTP-сервера на клиентских машинах

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, это означает, что веб-сервер, установленный на клиентской машине, работает правильно.

Test Nginx Installation on All CentOS 8 Client Machines

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
Verify HAProxy Status in CentOS 8

8. Теперь мы настроим HAProxy, используя следующий файл конфигурации.

# vi /etc/haproxy/haproxy.cfg

Файл конфигурации разделен на четыре основных раздела.

  • глобальные настройки – устанавливает параметры для всего процесса.
  • по умолчанию – этот раздел устанавливает параметры по умолчанию для всех других разделов, следующих за его объявлением.
  • frontend – этот раздел описывает набор прослушивающих сокетов, принимающих соединения клиентов.
  • Backend – этот раздел описывает набор серверов, к которым прокси будет подключаться для пересылки входящих соединений.

Чтобы понять параметры в разделах глобальные настройки и по умолчанию, прочтите документацию HAProxy (ссылка предоставлена в конце статьи). В этом руководстве мы будем использовать настройки по умолчанию.

Настройка ведения журнала HAProxy

9. HAProxy после развертывания будет играть значительную роль в вашей ИТ-инфраструктуре, поэтому настройка ведения журнала для него является обязательным требованием; это позволяет получать информацию о каждом подключении к вашим веб-серверам.

Параметр log (выделенный на следующем скриншоте) объявляет глобальный сервер Syslog (например, rsyslog, используемый по умолчанию в CentOS), который будет получать сообщения журнала. Здесь можно объявить несколько серверов.

Конфигурация по умолчанию указывает на localhost (127.0.0.1), а local2 – код уровня по умолчанию, используемый для идентификации сообщений журнала HAProxy в rsyslog.

HAProxy Default Log Parameter

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 Front-end и Back-ends

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

Следующая конфигурация определяет раздел listen, используемый для предоставления страницы HAProxy Stats. Параметр bind назначает прослушиватель для указанного IP-адреса (* в данном случае) и порт (9000).

Параметр enable включает страницу статистики, к которой можно получить доступ, используя URI /stats (т.е. http://server_ip:9000/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. Следующая конфигурация определяет раздел фронтенда с именем TL (вы можете выбрать любое название). Параметр mode определяет режим работы HAProxy.

Параметр acl (список управления доступом Access Control List) используется для принятия решения на основе содержимого, извлеченного из запроса. В этом примере запрос считается обычным HTTP, если он не сделан через SSL.

Затем используется настройка http-request set-header для добавления заголовка HTTP к запросу. Это помогает информировать Nginx, что первоначальный запрос был сделан через HTTP (или через порт 80).

Директива default_backend или use_backend определяет серверы бэкенда, в данном случае, на которые ссылается TL_web_servers.

Обратите внимание, что HAProxy вернет ошибку «503 Service Unavailable error», если запрос не маршрутизируется директивой 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 позволяет использовать сохранение на основе куки, она указывает HAProxy отправить куки с именем SERVERID клиенту и связать ее с ID сервера, который дал начальный ответ.

Директива server используется для определения серверов в формате имя_сервера (например, websrv1), IP_сервера:порт и опции.

Одной из ключевых опций является 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

Закомментируйте другие секции frontend и backend, как показано на скриншоте, который следует. Сохраните файл и закройте его.

Configuring HAProxy Front-end and Back-ends

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/
Check HAProxy Setup

19. Чтобы получить доступ к странице статистики HAProxy, используйте следующий адрес.

http://10.42.0.247:9000/stats

Затем используйте имя пользователя и пароль, которые вы определили в файле конфигурации HAProxy (см. параметр stats auth).

HAProxy Stats Login Page

После успешного входа вы попадете на страницу статистики HAProxy, которая показывает вам метрики, охватывающие состояние ваших серверов, текущие скорости запросов, времена ответов и многое другое.

Чтобы продемонстрировать, как работает отчет о состоянии в отношении цветовых кодов, мы подключили один из серверов бэк-энда.

HAProxy Statistics Report

Шаг 4: Настройка HTTPS в HAProxy с использованием самоподписанного SSL-сертификата

20. В этом заключительном разделе мы продемонстрируем, как настроить SSL/TLS для обеспечения безопасности всех коммуникаций между сервером HAProxy и клиентом. HAProxy поддерживает четыре основных режима конфигурации HTTPS, но для этого руководства мы будем использовать отключение SSL/TLS.

В режиме отключения SSL/TLS, HAProxy расшифровывает трафик на стороне клиента и подключается к бэк-серверам в виде чистого трафика.

Мы начнем с создания сертификата и ключа, как показано (отвечайте на вопросы соответственно на основе данных вашей компании во время создания сертификата, как показано на скриншоте).

# 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
Create SSL for HAProxy

21. Затем откройте файл конфигурации HAProxy (/etc/haproxy/haproxy.cfg) и отредактируйте раздел фронт-энда.

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
Configure HAProxy Front-end with SSL

Сохраните файл и закройте его.

22. Затем перезапустите службу HAProxy, чтобы применить новые изменения.

# systemctl restart haproxy.service

23. Затем откройте веб-браузер и попробуйте снова получить доступ к сайту. Браузер покажет ошибку из-за самоподписанного сертификата, нажмите Дополнительно, чтобы продолжить.

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

Это все на данный момент! Каждое веб-приложение имеет свой собственный набор требований, вам необходимо разработать и настроить балансировку нагрузки в соответствии с вашей ИТ-инфраструктурой и требованиями приложения.

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

Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/