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
- изменить планировщик на что-то другое, кроме круговой
- настроить приоритизацию/веса для определенных серверов
Вот и все!
Get new posts in your inbox
No spam. Unsubscribe anytime.