- Исходные данные
~# 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
Статья опубликована: 2017-09-13 13:48:24
Последние правки: 2018-03-05 13:04:18
Устанавливаем и настраиваем балансировщик haproxy в Ubuntu. Особенность настройки: два домена, http, https, терминация SSL (https-соединение с клиентами поддерживает haproxy, трафик между haproxy и бекенд-серверами - http).