Установка HAProxy на Linux (Debian/Ubuntu или CentOS/RedHat)
HAProxy это ПО с открытым исходным кодом, а так же быстрый и надежный балансировщик нагрузки для TCP и HTTP-приложений, посредством распределения входящих запросов на несколько обслуживающих серверов.
HAProxy используют многие высоконагруженные сайты ( например Twitter, Instagram и многие другие).
В своей статье «Установка HAProxy на Linux (Debian/Ubuntu или CentOS/RedHat)» я расскажу как можно установить HAproxy на различные Linux ОС, такие как CentOS, RedHat или Debian, Ubuntu. На готовых примера расскажу как работает данный балансировщик.
Рассмотрю готовый пример использования.
Для начала нужно установить все необходимое, например nginx или apache. Можно прочитать как это делается в моих статьях:
- Установка Nginx, PHP-FPM, MariaDB на CentOS 7 / RHEL 7
- Уcтановка nginx, MySQL, PHP (LEMP) stack на Debian/Ubuntu
- Установка Nginx с расширениями php5 и с поддержкой MySQL на CentOS
- Установка Apache2 с PHP5 и MySQL + phpmyadmin для CentOS/RedHat/Fedora
- Установка Apache2 с PHP5 и MySQL + phpmyadmin для Debian/Ubuntu/Mint
Я не буду рассказывать как установить PHP с веб сервером (apache/nginx/lighthttpd или другие). В моем примере, установлен LEMP (nginx с php-fpm (PHP) и mysql).
Рассмотрим мой готовый пример на реальных машинах. И так, я имею:
- VPS_HAproxy: 192.168.103.1 и я установлю на CentOS 6.6.
Stats:192.168.103.193:1936 — Дополнительный IP на VPS с HAproxy для статистики. - VPS_Debian: 192.168.103.2 ОС на Debian 8.
Думаю что хватит мне 3 виртуальные машины чтобы показать наглядную работу данного балансировщика. На VPS_HAproxy, я буду устанавливать сам балансировщик — HAproxy, так же он будет работать как front-end/back-end сервер.
Установка HAProxy.
Можно установить несколькими методами ( пакетом или с исходного кода).
1. Установка из пакетов.
Debian 6
Для начала необходимо включить репозиторий Backports:
$ echo deb http://httpredir.debian.org/debian-backports squeeze-backports-sloppy main | \ sudo tee /etc/apt/sources.list.d/backports.list
Тогда, используйте следующие команды для установки. И для начала, выполняем обновления ОС:
$ apt-get update
И выполняем установку:
$ apt-get install haproxy -t squeeze-backports-sloppy
Вы получите стабильный релиз HAProxy 1.5 (на момент написания статьи — это стабильная, последняя версия).
Debian 7
Для начала необходимо включить репозиторий Backports:
$ echo deb http://httpredir.debian.org/debian wheezy-backports main | \ sudo tee /etc/apt/sources.list.d/backports.list
Тогда, используйте следующие команды для установки.
И для начала, выполняем обновления ОС:
$ apt-get update
И выполняем установку:
$ apt-get install haproxy -t wheezy-backports
Вы получите стабильный релиз HAProxy 1.5 (на момент написания статьи — это стабильная, последняя версия).
Debian 8
И для начала, выполняем обновления ОС:
$ apt-get update
И выполняем установку:
$ apt-get install haproxy
Ubuntu 14.04
Для начала необходимо включить репозиторий Backports:
$ echo deb http://archive.ubuntu.com/ubuntu trusty-backports main universe | \ sudo tee /etc/apt/sources.list.d/backports.list
Тогда, используйте следующие команды для установки:
$ apt-get update $ apt-get install haproxy -t trusty-backports
RedHat’s (CentOS/RedHat/Fedora).
Добавляем EPEL репозиторий и после чего выполняем следующую команду:
# yum install haproxy
2. Установка из исходного кода.
Скачиваем исходный код:
# cd /usr/local/src && wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.12.tar.gz
Распакуем данный архив и перейдем в папку с исходным кодом:
# tar -zxvf haproxy-1.5.12.tar.gz && cd haproxy-1.5.12
Конфигурируем и собираем данный пакет.
Можно собрать в DEB или RPM пакет:
Создание RPM или DEB пакетов с Checkinstall в Linux
Более подробно напишу попозже, если что-то не понятно, пишите я постараюсь Вам помочь.
Настройка логов в HAProxy
Далее, необходимо включить функцию ведения лога (записи ошибок в лог) в HAProxy для будущей отладки, для этого внесем изменения в файле:
# vim /etc/haproxy/haproxy.cfg
Далее, в зависимости от дистрибутив внесите изменения в HAProxy.
Для RHEL/CentOS/Fedora
Под строчкой «#Global settings» вставляем:
log 127.0.0.1 local2
если она прописана, то не нужно ничего менять.
Для Ubuntu/Debian
Под строчкой «#Global settings» вносим изменения:
находим:
log /dev/log local0 log /dev/log local1 notice
Заменяем на:
log 127.0.0.1 local2
Далее, мы должны включить логирование для UDP в файле конфигурации:
# vim /etc/rsyslog.conf
Расскоментировать нужно ModLoad и UDPServerRun, здесь наш сервер будет слушать порт 514 для сбора логов в syslog.
[...] # Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 [...]
Далее, нам необходимо создать отдельный файл ‘haproxy.conf «в директории» /etc/rsyslog.d/ «, чтобы настроить отдельные log-файлы:
# vim /etc/rsyslog.d/haproxy.conf
Добавьте следующую строку в файл вновь создать.
local2.* /var/log/haproxy.log
Наконец, нужно перезапустить службу Rsyslog для обновления изменений:
# service rsyslog restart
Настройка HAProxy.
В качестве примера, я выбрал виртуальную машину на CentOS 6.6. Скопирую дефолтный конфиг ( чтобы можно было вернуть на прежнее место все как было):
# cp /etc/haproxy/haproxy.cfg{,.original}
Немного изменим конфигурационный файл, чтобы он выглядел так (конфиг для первого примера, на одной виртуальной машине):
# vim /etc/haproxy/haproxy.cfg
Затем мы должны определить front-end и back-end балансировки в глобальном файле конфигурации /etc/haproxy/haproxy.cfg, как показано ниже. Замените IP-адреса, имена хостов и учетные данные HAProxy на ваши.
И приводим к виду:
#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 # Total Max Connections. user haproxy group haproxy daemon nbproc 1 # Number of processing cores. ulimit-n 65536 # turn on stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 86400# default is 10s timeout queue 86400# default is 1m timeout connect 86400# default is 10s timeout client 86400# default is 1m timeout server 86400# default is 1m timeout http-keep-alive 30 # default is 10s timeout check 20 # default is 10s maxconn 50000 #default is 3000 #------------------------------------------------------ # [HTTP Site Configuration] #------------------------------------------------------ frontend haproxy.local bind 192.168.1.1:80 reqadd X-Forwarded-Proto:\ http default_backend haproxy.local backend haproxy.local 192.168.1.1:80 mode http balance roundrobin # Load balancing will work in round-robin process. option httpchk option httpclose option forwardfor cookie haproxy.local insert server localhost.localdomain 192.168.1.1:80 cookie localhost.localdomain check # backend server. server debian 192.168.103.2:80 cookie debian check # backend server. #server centos 192.168.0.3:80 check backup # backup fail-over Server, If three of the above fails this will be activated. #----------------------------------------------------------------------------------------
После того как вы настроили все в конфигурации, выполним перезапуск HAProxy:
# service haproxy restart
Так же добавим его в автозагрузку ОС, т.к у меня CentOS — это можно сделать:
# chkconfig haproxy on
Посмотреть стартует ли сервис при запуске операционной системе, можно так:
# chkconfig --list haproxy
Для пользователей Ubuntu/Debian, нужно установить «ENABLED=1» в «/etc/default/haproxy:
ENABLED=1
Может возникнуть ошибка:
[ALERT] 183/215554 (5435) : Starting frontend haproxy.local: cannot bind socket [192.168.1.193:80] [FAILED]
Смотрим кто занял 80-й порт:
# netstat -nat | grep 80 | grep LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
Вы можете “убить” его с помощью:
$ sudo fuser -k 80/tcp
А потом попробуйте перезагрузить Nginx снова:
# service nginx restart
Или апач:
# service httpd restart
И снова перезапускаем haproxy:
# service haproxy restart
Включаем SSL в HAProxy
Чтобы включить SSL в HAProxy, необходимо установить пакет mod_ssl для создания SSL сертификата для HAProxy.
Для RHEL/CentOS/Fedora.
Для apache вебсервер:
# yum install mod_ssl -y
Для Ubuntu/Debian.
Для apache вебсервер:
По умолчанию в Ubuntu / Debian, SSL уже имеется в пакете с Apache.
Включаем SSL в апаче:
# a2enmod ssl
После включения SSL, перезагрузите сервер Apache, чтобы изменения признаются:
# service apache2 restart
ВНИМАНИЕ! Если Вы используете nginx, то в нем уже подключен модуль SSL.
После перезагрузки, перейдите в каталог, SSL и создайте SSL сертификат, используя следующие команды:
# cd /etc/ssl/ # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/linux-notes.key -out /etc/ssl/linux-notes.crt
Смотрим что получилось:
# ls -al total 8 lrwxrwxrwx. 1 root root 16 May 22 13:52 certs -> ../pki/tls/certs -rw-r--r--. 1 root root 1448 Jul 3 22:52 linux-notes.crt -rw-r--r--. 1 root root 1704 Jul 3 22:52 linux-notes.key
И делаем сертификат из ключей:
# cat linux-notes.crt linux-notes.key > linux-notes.pem
Ну и вносим изменения:
# vim /etc/haproxy/haproxy.cfg
Добавляем https в конфиг как frontend:
[...] frontend haproxy.local bind 192.168.1.1:80 reqadd X-Forwarded-Proto:\ http default_backend haproxy.local #------------------------------------------------------ # [HTTPS Site Configuration] #------------------------------------------------------ frontend haproxy.local-SSL bind 192.168.103.1:443 ssl crt /etc/ssl/linux-notes.pem reqadd X-Forwarded-Proto:\ https default_backend haproxy.local backend haproxy.local 192.168.1.1:80 [...]
Затем добавляем правило перенаправления на https в конфигурации
[...] backend haproxy.local 192.168.1.1:80 redirect scheme https if !{ ssl_fc } [...]
После всех изменений выполняем перезагрузку сервиса haproxy:
# service haproxy restart
Я получил следующую ошибку:
Starting haproxy: [WARNING] 183/231445 (6560) : Setting tune.ssl.default-dh-param to 1024 by default, if your workload permits it you should set it to at least 2048. Please set a value >= 1024 to make this warning disappear.
Чтобы исправить следующее предупреждение, нужно в конфигурационный файл Haproxy (в секцию GLOBAL) прописать:
# tune.ssl.default-dh-param 2048
Ну и все, проверяем 😉
ПС: Незабываем создать конфигурационный файл для веб-сервера (apache\nginx) с возможностью использовать https.
Открытые портов для HAProxy в брандмауэре
Для CentOS/RHEL 6
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A INPUT -i eth0 -p udp --dport 514 -j ACCEPT # iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
На CentOS/RHEL 7 и Fedora 21
# firewallcmd permanent zone=public addport=514/tcp # firewallcmd permanent zone=public addport=80/tcp # firewallcmd permanent zone=public addport=443/tcp # firewallcmd reload
На Debian/Ubuntu
Добавьте строки что внизу в файл ‘/etc/iptables.up.rules’ чтобы включить порты на брандмауэре.
A INPUT p tcp dport 514 j ACCEPT A INPUT p tcp dport 80 j ACCEPT A INPUT p tcp dport 443 j ACCEPT
ВНИМАНИЕ! Так же, обязательно добавьте порт для статистики (можно указать при конфигурации статистики 80-й порт и тогда ничего не нужно будет добавлять), я использую порт 1936, но у меня выключен фаэрвол и мне не нужно было добавлять правило.
Тестирование HAproxy
Создам файл для тестирования с именем index.html:
# vim /home/captain/HAproxy/index.html
И вставлю следующий код:
<html> <head> <title> Linux-Notes HAProxy Test Page</title> </head> <body> <!-- Main content --> <h1>My HAProxy Test Page</h1> <p>Welcome to HA Proxy test page! <p>There should be more here, but I don't know what to be write :p. <address>Made 25 Jane 2015<br> by captain.</address> </body> </html>
Так же можно использовать следующий php скрипт cо следующим содержанием:
<?php header('Content-Type: text/plain'); echo "Server IP: ".$_SERVER['SERVER_ADDR']; echo "\nClient IP: ".$_SERVER['REMOTE_ADDR']; echo "\nX-Forwarded-for: ".$_SERVER['HTTP_X_FORWARDED_FOR']; ?>
После создания «index.html» файл, попытаемся получить доступ к сайту.
Session Stickiness
Если ваш веб-приложение служит динамическое содержимое на основе сеансов входа пользователей, посетители будут испытывать странные вещи из-за непрерывного переключения между VPS. «Session Stickiness» гарантирует, то что посетитель будет иметь свои куки наVPS.
Я приведу пример использования следующий PHP кода, чтобы продемонстрировать, как работает все это:
# vim /home/captain/HAproxy/session.php
добавляем:
<?php header('Content-Type: text/plain'); session_start(); if(!isset($_SESSION['visit'])) { echo "This is the first time you're visiting this server"; $_SESSION['visit'] = 0; } else echo "Your number of visits: ".$_SESSION['visit']; $_SESSION['visit']++; echo "\nServer IP: ".$_SERVER['SERVER_ADDR']; echo "\nClient IP: ".$_SERVER['REMOTE_ADDR']; echo "\nX-Forwarded-for: ".$_SERVER['HTTP_X_FORWARDED_FOR']."\n"; print_r($_COOKIE); ?>
Этот код создает PHP сессии и отобразит количество просмотров страниц за один сеанс.
И проверяем:
# curl -i http://1.1.1.1/session.php
После запуска haproxy с таким конфигурационным файлом вы можете в браузере открыть страничку http://<ваш-балансировщик>/stats.
Проведен небольшой эксперимент. При помощи программы wget запросим страничку тысячу раз такой командой:
for i in `seq 1 1000`; do wget http://192.168.103.1 -O -; done
Включаем статистику HAProxy
HAProxy статистика дает много информации о переданных данных, общей связи, состояния сервера и т.д. после установки HAProxy, если вы хотите посмотреть в HAProxy статистику, то ее можно легко настроить.
Отредактируем конфиг балансировщика:
# vim /etc/haproxy/haproxy.cfg
И прописываем (добавляем в самый конец конфига):
[...] listen stats 192.168.103.1:1936 mode http log global maxconn 10 clitimeout 100s srvtimeout 100s contimeout 100s timeout queue 100s stats enable stats hide-version stats refresh 30s stats show-node stats auth user:password stats uri /haproxy?stats
Ваш может получить доступ к статистике используя HAProxy URL-адрес:
URL: http://192.168.103.193:1936/haproxy?stats login: user Пароль: password
По желанию, можно изменить следующие параметры:
- listen stats 192.168.103.1:1936 — это IP на котором будет отображаться статистика ( мой HAproxy) и порт, нужен для вывода статистике.
Например:
listen stats 192.168.103.1:8080 - stats auth user:password, где user — это ваш пользователь и password — это пароль пользователя user.
Например:
stats auth captain:captain_password - stats uri /haproxy?stats — это ссылка по которой будет расположена статистика, ее можно изменить на любую другую. Например:
— stats uri /stats
— stats uri /haproxy-stats
На этом, моя тема «Установка HAProxy на Linux (Debian/Ubuntu или CentOS/RedHat)» подошла к завершению. Надеюсь было интересно и хорошо рассказано. Если есть Пожелания или замечания, пишите в комментариях.
Pretty! This has been an extremely wonderful post.
Thanks for providing these details.
I really like it whenever people get together
and share ideas. Great website, continue the good work!
Very nice article, totally what I needed.