В данной статье мы покажем настройку планировщика HAProxy для двух серверов с установленным веб-сервером Nginx (можно заменить на Apache). В качестве ОС во всех случаях используется CentOS.
HAProxy – серверное программное обеспечение для обеспечения высокой доступности и балансировки нагрузки для TCP и HTTP приложений, методом распределения входящих запросов на несколько серверов. HAProxy используется на многих популярных ресурсах, включая Twitter , Instagram , Github , Avito , Amazon и другие.
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 {_x000D_ listen IP_текущего_сервера:80 default_server;_x000D_ allow IP_первого_backend_сервера;_x000D_ allow IP_haproxy;_x000D_ deny all;_x000D_ server_name _;_x000D_ root /usr/share/nginx/html;_x000D__x000D_ # Load configuration files for the default server block._x000D_ include /etc/nginx/default.d/*.conf;_x000D__x000D_ location / {_x000D_ }_x000D__x000D_
Конфиг 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">_x000D__x000D_тут вы должны получить html документ_x000D_
Сервер отдал стандартный 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_x000D__x000D_Loading mirror speeds from cached hostfile_x000D__x000D_epel/x86_64/metalink_x000D__x000D_~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~_x000D__x000D_Running transaction_x000D__x000D_Installing : haproxy-1.5.18-9.el7.x86_64 1/1_x000D__x000D_Verifying : haproxy-1.5.18-9.el7.x86_64 1/1_x000D__x000D_Installed:_x000D__x000D_haproxy.x86_64 0:1.5.18-9.el7_x000D__x000D_Complete!_x000D_
Чтобы включить HaProxy, нужно добавить Enabled=1 в файл /etc/default/haproxy :
#nano /etc/default/haproxy
Теперь перейдем к самой настройке HaProxy. В нашей простейшей конфигурации сервер-балансировщик будет обрабатывать все http запросы и направлять их по очереди на backend-сервера.
#nano /etc/haproxy/haproxy.cfg
log /dev/log local0_x000D__x000D_ chroot /var/lib/haproxy_x000D_ pidfile /var/run/haproxy.pid_x000D_ maxconn 4000_x000D_ user haproxy_x000D_ group haproxy_x000D_ daemon_x000D__x000D_defaults_x000D_ mode http_x000D_ log global_x000D_ option httplog_x000D_ option redispatch_x000D_ retries 3_x000D_ timeout http-request 10s_x000D_ timeout queue 1m_x000D_ timeout connect 10s_x000D_ timeout client 1m_x000D_ timeout server 1m_x000D_ timeout http-keep-alive 10s_x000D_ timeout check 10s_x000D_ maxconn 3000_x000D__x000D_frontend www_x000D_ bind IP_балансировщика:80_x000D_ default_backend nginx_pool_x000D__x000D_backend nginx_pool_x000D_ balance roundrobin_x000D_ mode http_x000D_ server web1 IP_первого_backend_сервера:80 check_x000D_ server web2 IP_второго_backend_сервера:80 check_x000D_
После сохранения конфигурации, обязательно проверьте синтаксис командой:
#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_x000D_ bind :10001_x000D_ stats enable_x000D_ stats uri /haproxy_stats_x000D_ stats auth admin:admin_x000D_
Описание:
- 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 и вы всегда сможете найти применение его в своей работе.