Главная
Главная Руководства Ubuntu › Haproxy - установка и настройка в Ubuntu



Автор:

Статья опубликована: 2017-09-13 13:48:24
Последние правки: 2018-03-05 13:04:18

Устанавливаем и настраиваем балансировщик haproxy в Ubuntu. Особенность настройки: два домена, http, https, терминация SSL (https-соединение с клиентами поддерживает haproxy, трафик между haproxy и бекенд-серверами - http).

  • Исходные данные
    ~# cat /etc/os-release
    ...
    Ubuntu 16.04.2 LTS
    ...
    ~# haproxy -v
    HA-Proxy version 1.7.9-1 2017/08/19
    Copyright 2000-2017 Willy Tarreau 
    

  • Установка.
    Haproxy уже есть в стандартном репозитори Ubuntu 16.04, поэтому:
    # apt-get update
    # apt-get -y install haproxy
    

  • Настройка.
    В нашем примере:
    - домены: www.ex1.com, www.ex2.com
    - в бекенде: два сервера (у нас тест, поэтому сервер один, но с разносом в nginx по портам)

    Настройка nginx для теста.
    # backend 1
    server {
            listen 127.0.0.1:81;
            server_name www.ex1.com;
            root /var/www/haproxy-test/web1/www.ex1.com;
            index index.html;
    }
    server {
            listen 127.0.0.1:81;
            server_name www.ex2.com;
            root /var/www/haproxy-test/web1/www.ex2.com;
            index index.html;
    }
    
    
    # backend 2
    server {
            listen 127.0.0.1:82;
            server_name www.ex1.com;
            root /var/www/haproxy-test/web2/www.ex1.com;
            index index.html;
    }
    server {
            listen 127.0.0.1:82;
            server_name www.ex2.com;
            root /var/www/haproxy-test/web2/www.ex2.com;
            index index.html;
    }
    
    У нас получились два "виртуальных" web-сервера, web1 слушает на 127.0.0.1:81 (http), web2 на 127.0.0.1:82 (http). Также, сделаем четыре файла, index.html с разным содержимым (можно будет сразу видеть, с какого сервера был отдан контент):
    /var/www/haproxy-test/web1/www.ex1.com/index.html, в него пишем: www.ex1.com - web1
    /var/www/haproxy-test/web1/www.ex2.com/index.html, а в этот пишем: www.ex2.com - web1
    /var/www/haproxy-test/web2/www.ex1.com/index.html, сюда пишем: www.ex1.com - web2
    /var/www/haproxy-test/web2/www.ex2.com/index.html, внутри: www.ex2.com - web2
    На самом деле нужно, чтобы содержимое директорий с сайтами на web1 и web2 было идентичным, мы сделали все файлы разными исключительно для теста.
    Необходимо перезагрузить nginx, чтобы изменения вступили в силу.

    Настройки haproxy хранятся в /etc/haproxy/haproxy.cfg
    В "пустом" файле есть только секции global и defaults. По большому счету их трогать не нужно, если только ради более тонкой настройки. Дописываем свои секции, одну для http, другую для https:
    listen webhttp
     bind :80
     mode http
     balance roundrobin
     cookie srv insert indirect nocache
     option forwardfor header X-Real-IP
     option httplog
     option httpchk HEAD /index.html HTTP/1.0
     server webhttp1 127.0.0.1:81 cookie webhttp1 check
     server webhttp2 127.0.0.1:82 cookie webhttp2 check
     http-request del-header Proxy
    
    listen webssl
     bind :443 ssl crt /etc/haproxy/ssl
     mode http
     balance roundrobin
     cookie srv insert indirect nocache
     option forwardfor header X-Real-IP
     option httplog
     option httpchk HEAD /index.html HTTP/1.0
     server webssl1 127.0.0.1:81 cookie webssl1 check
     server webssl2 127.0.0.1:82 cookie webssl2 check
     http-request del-header Proxy
    
    - httpchk HEAD /index.html HTTP/1.0 : способ проверки доступности серверов
    - bind :443 ssl crt /etc/haproxy/ssl : биндим на все ip и порт 443
    - /etc/haproxy/ssl : директория, где хранятся сертификаты сайтов


  • Отдельно про сертификаты.
    Файл сертификата должен включать в себя: публичный ключ, всю цепочку до корневого и сертификат корневого центра, а также приватный ключ.
    Если сайт один, то файл сертификата можно назвать как угодно и в строке настройки указать полный путь до него:
     bind :443 ssl crt /etc/haproxy/ssl/site.pem
    
    Если сайтов несколько, то файлы необходимо называть по url сайта, например, www.ex1.com.pem, а в настройках указать только директорию, где находятся сертификаты:
     bind :443 ssl crt /etc/haproxy/ssl
    
    Важно! Если haproxy настроен на работу с https, а сертификата для одного из сайтов нет (да, бывает и такое, к сайту не предполагается доступ по https, но пользователь может руками набрать https://www.ex1.com/), то для инициализации соединения будет взят первый сертификат из списка, отсортированного по названию. Для того, чтобы на сайте не светился чужой сертификат, можно выпустить самоподписной сертификат и поместить его в директории сертификатов, чтобы он находился вверху списка, в таком случае посетитель получит сообщение о том, что "к сертификату нет доверия, так как он является самоподписанным. Сертификат недействителен для имени www.ex1.com. Код ошибки: SEC_ERROR_UNKNOWN_ISSUER".
    Как сделать самоподписной сертификат для haproxy? Нет ничего сложного:
    ~# openssl req -new -x509 -nodes -out _local.crt -keyout _local.key
    
    Далее, склеиваем получившиеся файлы в один:
    ~# cat _local.crt >> _local.pem
    ~# cat _local.key >> _local.pem
    
    Получившийся _local.pem переносим в директорию с сертификатами (в нашем примере /etc/haproxy/ssl).


  • Мониторинг.
    Как всякий приличный сервис, haproxy предоставляет возможность мониторинга и просмотра статистики. Для этого необходима дополнительная настройка в /etc/haproxy/haproxy.conf. Есть два варианта. И там и там статистика будет доступна на всех сайтах, которые обслуживает haproxy.
    Вариант первый, добавить настройки в секцию listen webhttp или в listen webssl или в defaut:
     stats enable
     stats uri /stats
     stats realm Haproxy
     stats auth admin:12345
     stats refresh 30s
    
    В первом случае статистика будет доступна при заходе по ссылке вида http://www.ex1.com/stats, во втором по ссылке вида https://www.ex1.com/stats, в третьем и по http и по https.
    Логин для входа: admin, пароль: 12345.
    Вариант второй, сделать доступ по отдельному порту через отдельную секцию:
    listen webstat                                                                                                                          
     bind :82
     mode http
     stats enable
     stats uri /
     stats realm Haproxy
     stats auth admin:12345
     stats refresh 30s
    
    В этом случае доступ к статистике через url вида http://www.ex1.com:82, http://www.ex2.com:82. http или https - зависит от настроек в строке с bind


  • Запуск.
    # systemctl start haproxy
    
    Перезапуск:
    # systemctl restart haproxy
    
    Остановка:
    # systemctl stop haproxy
    
    Автозапуск при загрузке Ubuntu:
    # systemctl enable haproxy
    
    Убрать из автозапуска:
    # systemctl disable haproxy