HAProxy · 4 min read · Nov 12, 2025

Балансировка нагрузки веб-сервера с HAProxy на Ubuntu 14.04

Что такое HAProxy?

HAProxy(High Availability Proxy) — это балансировщик нагрузки с открытым исходным кодом, который может балансировать любую TCP-службу. HAProxy — это бесплатное, очень быстрое и надежное решение, которое предлагает балансировку нагрузки, высокую доступность и проксирование для приложений на основе TCP и HTTP. Он особенно хорошо подходит для веб-сайтов с очень высоким трафиком и поддерживает многие из самых посещаемых в мире.

С момента своего существования он стал де-факто стандартом среди балансировщиков нагрузки с открытым исходным кодом. Хотя он не рекламирует себя, его широко используют. Ниже представлена базовая схема того, как выглядит установка:

Установка HAProxy

Я использую Ubuntu 14.04 и устанавливаю его с помощью:

apt-get install haproxy

Вы можете проверить версию с помощью:

haproxy -v

Нам нужно включить HAProxy для запуска с помощью скрипта инициализации /etc/default/haproxy. Установите параметр ENABLED в 1 следующим образом:

ENABLED=1

Чтобы проверить, правильно ли внесены изменения, выполните скрипт инициализации HAProxy без каких-либо параметров. Вы должны увидеть следующее:

$ service haproxy   
 reload   restart  start    status   stop

HAProxy теперь установлен. Давайте создадим установку, в которой у нас будет 2 (два) экземпляра веб-сервера Apache и 1 (один) экземпляр HAProxy. Ниже представлена информация о настройке:

Мы будем использовать три системы, виртуально развернутые через VirtualBox:
Экземпляр 1 - Балансировщик нагрузки

Имя хоста: haproxy
ОС: Ubuntu
Частный IP: 192.168.205.15

Экземпляр 2 - Веб-сервер 1

Имя хоста: webser01
ОС: Ubuntu с LAMP
Частный IP: 192.168.205.16

Экземпляр 2 - Веб-сервер 2

Имя хоста: webserver02
ОС: Ubuntu с LAMP
Частный IP: 192.168.205.17

Вот схема того, как выглядит установка:
Теперь давайте настроим HAProxy.

Настройка HAProxy

Создайте резервную копию оригинального файла, переименовав его:

mv /etc/haproxy/haproxy.cfg{,.original}

Мы создадим наш собственный файл haproxy.cfg. Используя ваш любимый текстовый редактор, создайте файл /etc/haproxy/haproxy.cfg следующим образом:

global
        log /dev/log   local0
        log 127.0.0.1   local1 notice
        maxconn 4096
        user haproxy
        group haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        option redispatch
        maxconn 2000
        contimeout     5000
        clitimeout     50000
        srvtimeout     50000

listen webfarm 0.0.0.0:80
    mode http
    stats enable
    stats uri /haproxy?stats
    balance roundrobin
    option httpclose
    option forwardfor
    server webserver01 192.168.205.16:80 check
    server webserver02 192.168.205.17:80 check

Объяснение:

global
        log /dev/log   local0
        log 127.0.0.1   local1 notice
        maxconn 4096
        user haproxy
        group haproxy
        daemon

Директива log указывает на сервер syslog, на который будут отправляться сообщения журнала.
Директива maxconn указывает количество одновременных соединений на фронтенде. Значение по умолчанию — 2000 и должно быть настроено в соответствии с конфигурацией вашей системы.
Директивы user и group изменяют процесс HAProxy на указанный пользователь/группа. Эти значения не следует изменять.

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        option redispatch
        maxconn 2000
        contimeout     5000
        clitimeout     50000
        srvtimeout     50000

В приведенном выше разделе указаны значения по умолчанию. Опция redispatch включает перераспределение сессий в случае сбоев соединения. Таким образом, привязка сессий отменяется, если экземпляр веб-сервера выходит из строя.
Директива retries устанавливает количество повторных попыток, которые необходимо выполнить на экземпляре веб-сервера после сбоя соединения.
Значения, которые необходимо изменить, — это различные директивы таймаута. Опция contimeout указывает максимальное время ожидания успешной попытки соединения с экземпляром веб-сервера.
Опции clitimeout и srvtimeout применяются, когда ожидается, что клиент или сервер подтвердят или отправят данные в процессе TCP. HAProxy рекомендует устанавливать таймауты клиента и сервера на одно и то же значение.


listen webfarm 0.0.0.0:80
    mode http
    stats enable
    stats uri /haproxy?stats
    balance roundrobin
    option httpclose
    option forwardfor
    server webserver01 192.168.205.16:80 check
    server webserver02 192.168.205.17:80 check

Вышеуказанный блок содержит конфигурацию как для фронтенда, так и для бэкенда. Мы настраиваем HAProxy для прослушивания на порту 80 для webfarm, который просто является именем для идентификации приложения.
Директивы stats включают страницу статистики соединений. Эту страницу можно просмотреть по URL, указанному в stats uri, так что в этом случае это http://192.168.205.15/haproxy?stats, демонстрацию этой страницы можно посмотреть здесь.
Директива balance указывает алгоритм балансировки нагрузки, который следует использовать. Доступные варианты алгоритмов:

  • Круговая (roundrobin),
  • Статическая круговая (static-rr),
  • Наименьшее количество соединений (leastconn),
  • Источник (source),
  • URI (uri) и
  • Параметр URL (url_param).

Информацию о каждом алгоритме можно получить из официальной документации.

Директива server объявляет бэкенд-сервер, синтаксис:

server  [:port] [param*]

Имя, которое мы указываем здесь, будет отображаться в журналах и оповещениях. Существуют и другие параметры, поддерживаемые этой директивой, и мы будем использовать параметр check в этой статье. Опция check включает проверки состояния экземпляра веб-сервера, в противном случае экземпляр веб-сервера всегда считается доступным.

После завершения настройки запустите службу HAProxy:

sudo service haproxy start

Тестирование балансировки нагрузки и переключения на резервный сервер

Мы добавим имя сервера в файл index.html по умолчанию, который находится по умолчанию по адресу /var/www/index.html

На экземпляре 2 - Веб-сервер 1 (webserver01 с IP- 192.168.205.16) добавьте следующую строку:

sudo sh -c "echo 

Hostname: webserver01 (192.168.205.16)

>> /var/www/index.html"

На экземпляре 3 - Веб-сервер 2 (webserver02 с IP- 192.168.205.17) добавьте следующую строку:

sudo sh -c "echo 

Hostname: webserver02 (192.168.205.17)

>> /var/www/index.html"

Теперь откройте веб-браузер на локальном компьютере и перейдите по IP-адресу haproxy, т.е. http://192.168.205.15

Каждый раз, когда вы обновляете вкладку, вы увидите, что нагрузка распределяется между каждым веб-сервером. Ниже приведен скриншот моего браузера:

В первый раз, когда я посещаю http://192.168.205.15, я получаю:

А во второй раз, т.е. когда я обновляю страницу, я получаю:

Вы также можете проверить статистику haproxy, посетив http://192.168.205.15/haproxy?stats

С этим набором можно сделать еще больше. Некоторые идеи включают:

  • отключить один или оба веб-сервера, чтобы протестировать, что происходит, когда вы обращаетесь к HAProxy
  • настроить HAProxy для обслуживания пользовательской страницы обслуживания
  • настроить веб-интерфейс, чтобы вы могли визуально отслеживать статистику HAProxy
  • изменить планировщик на что-то другое, кроме круговой
  • настроить приоритизацию/веса для определенных серверов

Вот и все!

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.