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

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

Проверка установки Nginx на всех клиентах с CentOS 8

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

Проверить статус HAProxy в CentOS 8

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.

Параметр журнала по умолчанию HAProxy

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

Закомментируйте все остальные секции фронтенда и бэкенда, как показано на следующем скриншоте. Сохраните файл и закройте его.

Настройка фронтенда и бэкендов HAProxy

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/

Проверить настройку HAProxy

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

http://10.42.0.247:9000/stats

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

Страница входа в статистику HAProxy

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

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

Отчет статистики 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

Создать SSL для HAProxy

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

Настройка фронтенда HAProxy с SSL

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

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

# systemctl restart haproxy.service

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

Ошибка SSL-соединения HAProxy

Продолжить соединение

Доступ к сайту через HTTPS

На этом пока всё! У каждого веб-приложения есть свой набор требований, вам нужно разрабатывать и настраивать балансировку нагрузки в соответствии с вашей IT-инфраструктурой и требованиями приложения.

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