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

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
Файл конфигурации разделен на четыре основных раздела.
- глобальные настройки – устанавливает параметры для всего процесса.
- по умолчанию – этот раздел устанавливает параметры по умолчанию для всех других разделов, следующих за его объявлением.
- frontend – этот раздел описывает набор прослушивающих сокетов, принимающих соединения клиентов.
- Backend – этот раздел описывает набор серверов, к которым прокси будет подключаться для пересылки входящих соединений.
Чтобы понять параметры в разделах глобальные настройки и по умолчанию, прочтите документацию HAProxy (ссылка предоставлена в конце статьи). В этом руководстве мы будем использовать настройки по умолчанию.
Настройка ведения журнала HAProxy
9. HAProxy после развертывания будет играть значительную роль в вашей ИТ-инфраструктуре, поэтому настройка ведения журнала для него является обязательным требованием; это позволяет получать информацию о каждом подключении к вашим веб-серверам.
Параметр 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 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, как показано на скриншоте, который следует. Сохраните файл и закройте его.

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 расшифровывает трафик на стороне клиента и подключается к бэк-серверам в виде чистого трафика.
Мы начнем с создания сертификата и ключа, как показано (отвечайте на вопросы соответственно на основе данных вашей компании во время создания сертификата, как показано на скриншоте).
# 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. Вы можете оставлять любые вопросы или мысли через форму обратной связи ниже.
Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/