Установка HAProxy на Linux (Debian/Ubuntu или CentOS/RedHat)

Установка 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. Можно прочитать как это делается в моих статьях:

Я не буду рассказывать как установить PHP с веб сервером (apache/nginx/lighthttpd или другие). В моем примере, установлен LEMP (nginx с php-fpm (PHP) и mysql).

Рассмотрим мой готовый пример на реальных машинах. И так, я имею:

  1. VPS_HAproxy: 192.168.103.1  и я установлю на CentOS 6.6.
    Stats:192.168.103.193:1936 — Дополнительный IP  на VPS  с  HAproxy для статистики.
  2. 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

# firewall­cmd ­­permanent ­­zone=public ­­add­port=514/tcp
# firewall­cmd ­­permanent ­­zone=public ­­add­port=80/tcp
# firewall­cmd ­­permanent ­­zone=public ­­add­port=443/tcp
# firewall­cmd ­­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
статистика в haproxy

статистика в haproxy

По желанию, можно изменить следующие параметры:

  • 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)» подошла к завершению. Надеюсь было интересно и хорошо рассказано. Если есть Пожелания или замечания, пишите в комментариях.

3 thoughts on “Установка HAProxy на Linux (Debian/Ubuntu или CentOS/RedHat)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.