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

Как настроить 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 – этот раздел устанавливает параметры по умолчанию для всех остальных разделов после его объявления.
  • интерфейс – в этом разделе описывается набор прослушивающих сокетов, принимающих клиентские соединения.
  • Бэкенд – в этом разделе описывается набор серверов, к которым будет подключаться прокси-сервер для пересылки входящих соединений.

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

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

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

Параметр журнала (выделен на следующем снимке экрана) объявляет глобальный сервер 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 и измените разделы внешнего и внутреннего интерфейса по умолчанию следующим образом. Мы не будем вдаваться в подробное объяснение каждого параметра, вы всегда можете обратиться к официальной документации.

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

Параметр stats enable включает страницу статистики, доступ к которой будет осуществляться с помощью 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. Следующая конфигурация определяет раздел интерфейса под названием 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 выбирает внутренние серверы для обработки запроса, если нет. метод persistence отменяет этот выбор.

Директива cookie обеспечивает сохранение на основе файлов cookie, она дает команду HAProxy отправить клиенту файл cookie с именем SERVERID и чтобы связать его с ID сервера, который дал первоначальный ответ.

Директива server используется для определения вышестоящих серверов в формате sever_name (например, websrv1), server_IP:port и параметры.

Одним из ключевых вариантов является проверить, который сообщает 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 (см. параметр аутентификации статистики).

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

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

Шаг 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

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

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

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

systemctl restart haproxy.service

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

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

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