November 24, 2022

HAProxy: балансировки нагрузки между веб-серверами Nginx

Настройка Nginx на backend-серверах

Начнем с установки и настройки Nginx на наших веб-серверах, между которыми будет балансировать нагрузка. Установим репозиторий EPEL и собственно сам nginx с помощью yum:

#yum install epel-release -y#yum install nginx -y

Я выполнял установку сразу на двух серверах, так как сервера настраиваются один в один (для параллельного выполнения команд на нескольких серверах можно использовать pdsh).

Далее в конфигурационных файлах nginx.conf укажем, что сервера должны обрабатывать запросы только с сервера HaProxy и backend-серверов:

1-ый backend-сервер:

server { listen IP_текущего_сервера:80 default_server;  allow IP_второго_backend_сервера; allow IP_haproxy; deny all; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } 

2-ой backend-сервер:

server {
        listen       IP_текущего_сервера:80 default_server;
        allow IP_первого_backend_сервера;
        allow IP_haproxy;
        deny all;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

Конфиг nginx стандартный, мы лишь добавили в listen IP сервера и закрыли доступ всем, кроме наших серверов с помощью директив allow и deny.

Для работы веб-сервера, нужно открыть соединения на файерволле через firewalld или iptables:

#firewall-cmd --permanent –add-service=http#firewall-cmd –reload

Выполним тестовую проверку на любом из backend-серверов:

[root@server ~]# curl IP_второго_сервера

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

тут вы должны получить html документ

Сервер отдал стандартный index файл nginx, значит между собой сервера взаимодействуют.

Для удобства проверки, я изменил содержимое index файла на каждом backend-сервере, чтобы в процессе тестирования четко видеть в браузере какой сервер обработал запрос.

Index файл nginx расположен в /usr/share/nginx/html/.

Настройка балансировщика нагрузки HAProxy

Приступим к установке и настройке HAProxy на сервере, который будет использоваться в качестве балансировщика нагрузки.

Установим HaProxy и выполним базовые настройки для работы балансировщика.

#yum install epel-release -y

#yum install haproxy -y

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

epel/x86_64/metalink

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Running transaction

Installing : haproxy-1.5.18-9.el7.x86_64 1/1

Verifying : haproxy-1.5.18-9.el7.x86_64 1/1

Installed:

haproxy.x86_64 0:1.5.18-9.el7

Complete!

Чтобы включить HaProxy, нужно добавить Enabled=1 в файл /etc/default/haproxy:

#nano /etc/default/haproxy

Теперь перейдем к самой настройке HaProxy. В нашей простейшей конфигурации сервер-балансировщик будет обрабатывать все http запросы и направлять их по очереди на backend-сервера.

#nano /etc/haproxy/haproxy.cfg

log         /dev/log local0

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

defaults
    mode                    http
    log                       global
    option                  httplog
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend  www
    bind IP_балансировщика:80
    default_backend nginx_pool

backend nginx_pool
    balance     roundrobin
    mode http
    server  web1 IP_первого_backend_сервера:80 check
    server  web2 IP_второго_backend_сервера:80 check

После сохранения конфигурации, обязательно проверьте синтаксис командой:

#haproxy -f /etc/haproxy/haproxy.cfg -c

Если все в порядке, вы получите подобный результат:

Configuration file is valid

После этого нужно перезапустить HaProxy и добавить его автозагрузку CentOS. А также открыть необходимые правила на файерволле.

#systemctl restart haproxy

#systemctl enable haproxy

#firewall-cmd —permanent –add-service=http

#firewall-cmd –reload

На этом настройка балансировщика закончена, проверим результат, открыв IP сервера с HaProxy в браузере:

Как видно, по очереди отдали контент оба сервера, балансировщик работает.

Параметры конфигурационного файла haproxy.cfg

Рассмотрим основные примеры алгоритмов работы HaProxy:

  • roundrobin — алгоритм используемый по умолчанию, отправляет запросы на сервера по очереди. В нашем примере мы использовали именно такой метод;
  • leastconn – выбирает сервер с наименьшим количеством активных соединений. Рекомендуется применять на проектах, в которых сессии могут быть задействованы продолжительное время;
  • source – выбирает сервер по хешу, построенному на основе IP пользователей. В таком режиме работы один и тот же клиент будет обращаться всегда к одному серверу, если его IP остается неизменным;

Пройдем по некоторым параметрам в конфигурационном файле.

Блок global:

  • log — вести лог в /dev/log сохраняя в «объект» local0;
  • chroot — настройки безопасности, «запирающие» HAProxy в указанной директории;
  • maxconn — максимальное количество конкурирующих соединений на один процесс;
  • user — пользователь, от имени которого будет запущена программа;
  • group — группа пользователя, от имени которого будет запущена программа;
  • daemon — запуск процесса как демона.

Блок default. В данном блоке описываются параметры по умолчанию для всех других секций, которые следуют за ней:

  • log — указывает, в какой лог вести записи (global в данном случае означает, что используются параметры, заданные в секции global);
  • mode — устанавливает протокол взаимодействия, принимает одно из значений: tcp, http или health;
  • retries — количество попыток соединения с сервером в случае отказа;
  • option httplog — формат лога, в случае использования HAProxy для проксирования HTTP-запросов;
  • option redispatch — разрешает программе разорвать и переназначить сессию в случае отказа сервера;
  • contimeout — максимальное время ожидания успешного соединения с сервером.

Также есть большое количество параметров связанных с различными timeout.

Сбор статистики HAProxy

Добавим в конфигурационный файл блок stats:

listen stats
    bind :10001
    stats enable
    stats uri /haproxy_stats
    stats auth admin:admin

Описание:

  • bind – порт по которому будет работать просмотр статистики;
  • stats enable – включить отчеты со статистикой;
  • stats uri – установка адреса страницы со статистикой;
  • stats auth – логин и пароль для входа.

Вы можете указать любой удобный для вас порт, если указанный в статье занят или не подходит для вас.

Также для работы нашего haproxy_stats, нужно открыть указанный ранее порт на файерволле:

firewall-cmd --permanent –add-port=10001/tcp

firewall-cmd –reload

Чтобы посмотреть отчеты по работе HAProxy, нужно перейти по ссылке:

http://hostname_haproxy:10001/haproxy_stats

Открываем адрес балансировщика в браузере и начинаем спамить F5. Статистика по указанной ссылке меняется, утилита работает.

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

Есть еще много вариантов использования модуля HAProxy и вы всегда сможете найти применение его в своей работе.