Как настроить 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. Вы можете задать любые вопросы или мысли через форму обратной связи ниже.