HAProxy балансування навантаження між веб-серверами Nginx

У даній статті ми покажемо настройку планувальника HAProxy для двох серверів з встановленим веб-сервером Nginx (Можна замінити на Apache). В якості ОС в усіх випадках використовується CentOS.

HAProxy - серверне програмне забезпечення для забезпечення високої доступності та балансування навантаження для TCP і HTTP додатків, методом розподілу вхідних запитів на кілька серверів. HAProxy використовується на багатьох популярних ресурсах, включаючи Twitter, Instagram, Github, Avito, Amazon та інші.

HAProxy встановлюється на окремий сервер, який приймає клієнтські запити і перенаправляти їх на веб-сервера Nginx. Нижче представлена ​​загальна архітектура системи.

зміст:

  • Налаштування Nginx на backend-серверах
  • Налаштування балансувальника навантаження HAProxy
  • Параметри конфігураційного файлу haproxy.cfg
  • Збір статистики HAProxy

Налаштування 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_второго_сервера

 тут ви повинні отримати 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. Статистика за вказаним URL змінюється, утиліта працює.

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

Є ще багато варіантів використання модуля HAProxy і ви завжди зможете знайти застосування його в своїй роботі.