HAProxy (High Availability Proxy) – это популярный TCP/HTTP балансировщик нагрузки с открытым исходным кодом для Linux, Solaris и FreeBSD. Как правило, он используется для повышения производительности и надежности серверной среды за счет распределения нагрузки между несколькими серверами. Многие сервисы с высокой нагрузкой (в том числе GitHub, Imgur, Instagram и Twitter) используют HAProxy.
Данное руководство поможет настроить HAProxy для поддержки терминации SSL и балансировки нагрузки приложения, а также перенаправить HTTP на HTTPS с помощью HAProxy.
Примечание: Встроенная поддержка SSL появилась в HAProxy с версией 1.5.x, официальный релиз которой состоялся в июне 2014.
В результате пользователи смогут получить доступ к вашему сайту, подключаясь к серверу HAProxy по HTTPS, который будет расшифровывать SSL-сессию и пересылать незашифрованные запросы на веб-серверы через их интерфейсы частной сети на порт 80. Затем веб-серверы отправят ответы на сервер HAProxy, который зашифрует и отправит их обратно пользователю, который сделал запрос.
На бэкэнде можно использовать любое количество веб-серверов для обслуживания одного и того же контента (то есть такая настройка легко масштабируется). Имейте в виду, что с увеличением трафика сервер HAProxy может стать узким местом в производительности, если у него нет достаточного количества системных ресурсов для обработки такого трафика.
Требования
- Сервер Ubuntu 14.04.
- Минимум один веб-сервер с частной сетью, прослушивающий порт 80.
- Дополнительный VPS с доступом root для установки HAProxy.
- SSL-сертификат и пара ключей (в поле Common Name нужно указать своё доменное имя или IP). Вы можете создать самоподписанный сертификат или получить бесплатный от Let’s Encrypt.
Создание PEM-файла для ключа и сертификата SSL
Чтобы настроить SSL-терминацию на HAProxy, нужно перевести ключ и сертификат SSL в подходящий формат, PEM. В большинстве случаев можно просто объединить файлы SSL-сертификата (расширение .crt или .cer) и ключа (расширение .key). К примеру, если сертификат называется example.com.crt, а ключ – example.com.key, для объединения файлов можно использовать такую команду:
cat example.com.crt example.com.key > example.com.pem
sudo cp example.com.pem /etc/ssl/private/
Эти команды создадут PEM-файл, объединяющий ключ и сертификат; файл будет называться example.com.pem и храниться в каталоге /etc/ssl/private.
Примечание: Иногда в PEM-файл нужно добавить root-сертификат и промежуточный сертификат CA.
Установка HAProxy 1.6.x
Примечание: В данном руководстве виртуальный выделенный сервер называется haproxy-www.
Добавьте архив PPA:
sudo add-apt-repository ppa:vbernat/haproxy-1.6
Обновите индекс пакетов:
sudo apt-get update
Установите HAProxy 1.6:
sudo apt-get install haproxy
Настройка HAProxy
Конфигурационный файл HAProxy находится в /etc/haproxy/haproxy.cfg. Он делится на две части:
- Global: содержит глобальные настройки процессов.
- Proxies: содержит разделы defaults, listen, frontend и backend.
Глобальные настройки HAProxy
Примечание: Все настройки нужно выполнять на виртуальном выделенном сервере (в данном случае он называется haproxy-www).
Откройте haproxy.cfg:
sudo vi /etc/haproxy/haproxy.cfg
Вы увидите, что файл содержит два раздела: global и defaults.
Сначала нужно настроить параметр maxconn. Он определяет количество подключений, которое может одновременно поддерживать HAProxy. Это позволяет избежать проблем с ресурсами и перенагрузки веб-сервера запросами. Это значение индивидуально для каждого сервера, потому рекомендуется подобрать его самостоятельно. Чтобы установить этот параметр, добавьте в настройки global следующую строку:
maxconn 2048
Чтобы настроить максимальный размер генерируемых временных ключей DHE, добавьте эту строку:
tune.ssl.default-dh-param 2048
Затем перейдите в раздел defaults и добавьте следующую строку:
option forwardfor
option http-server-close
Опция forwardfor настраивает HAProxy для поддержки заголовков запросов X-Forwarded-For, а опция http-server-close уменьшает время задержки между HAProxy и пользователем.
Настройка статистики
Настройки stats определяют, как HAProxy обрабатывает входящий трафик. Чтобы включить страницу HAProxy stats, добавьте в раздел defaults следующее:
stats enable
stats uri /stats
stats realm Haproxy\ Statistics
stats auth user:password
Примечание: Замените user и password именем пользователя и паролем.
Теперь вы можете получить доступ к статистике сервера HAProxy, добавив к домену раздел /stats (например, https://example.com/stats).
Теперь можно приступать к настройке прокси.
Настройка прокси
Фронтенд
Для начала нужно добавить фронтенд для обработки HTTP-подключений. Перейдите в конец файла и добавьте фронтенд под названием www-http.
Примечание: Вместо haproxy_www_public_IP нужно указать внешний IP сервера.
frontend www-http
bind haproxy_www_public_IP:80
reqadd X-Forwarded-Proto:\ http
default_backend www-backend
Рассмотрим эти параметры подробнее:
- frontend www-http: задаёт имя фронтенда www-http.
- bind haproxy_www_public_IP:80: устанавливает порт, на котором HAProxy будет обрабатывать входящий трафик (80 – стандартный порт HTTP); не забудьте заменить haproxy_www_public_IP внешним IP-адресом сервера.
- reqadd X-Forwarded-Proto:\ http: добавляет http-заголовок в конец запроса HTTP.
- default_backend www-backend: эта настройка перенаправляет весь входящий трафик на www-backend.
Теперь нужно добавить фронтенд для обработки входящих соединений HTTPS. Добавьте в конец файла фронтенд www-https.
Примечание: Вместо haproxy_www_public_IP нужно указать внешний IP сервера.
frontend www-https
bind haproxy_www_public_IP:443 ssl crt /etc/ssl/private/example.com.pem
reqadd X-Forwarded-Proto:\ https
default_backend www-backend
- frontend www-https: задаёт имя фронтенда www-http.
- bind haproxy_www_public_IP:443 ssl crt: устанавливает порт, на котором HAProxy будет обрабатывать входящий трафик (443 – стандартный порт HTTPS); не забудьте заменить haproxy_www_public_IP внешним IP-адресом сервера. Вместо example.com.pem укажите имя pem-файла, в котором хранятся SSL-сертификат и ключ.
- reqadd X-Forwarded-Proto:\ http: добавляет http-заголовок в конец запроса HTTP.
- default_backend www-backend: эта настройка перенаправляет весь входящий трафик на www-backend.
Настройки бэкенда
Теперь можно приступить к настройке бэкенда. Для этого нужно добавить в файл следующие параметры:
backend www-backend
redirect scheme https if !{ ssl_fc }
server www-1 www_1_private_IP:80 check
server www-2 www_2_private_IP:80 check
Примечание: Замените www_1_private_IP и www_2_private_IP внутренними IP-адресами веб-серверов.
- backend www-backend: задаёт имя бэкенда www-backend.
- redirect scheme https if !{ ssl_fc }: перенаправляет запросы HTTP на HTTPS. После этого сайт будет доступен только по HTTPS. Чтобы сайт поддерживал и HTTP, и HTTPS, удалите эту строку из файла.
- server www-1 …: указывает внутренний IP-адрес и порт (80) бэкенд сервера www-1. Благодаря опции check балансировщик нагрузки будет периодически выполнять проверку работоспособности этого сервера.
- server www-2 …: аналогична предыдущей строке.
Примечание: Чтобы добавить больше серверов, используйте формат строки www_1…, указав соответствующие данные о новом сервере.
Сохраните и закройте haproxy.cfg. Теперь нужно настроить логирование HAProxy.
Логирование HAProxy
Чтобы настроить логирование, откройте файл rsyslog.conf:
sudo vi /etc/rsyslog.conf
Найдите в нём следующие две строки и раскомментируйте их. В результате они будут выглядеть так:
$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1
Перезапустите rsyslog, чтобы обновить настройки:
sudo service rsyslog restart
Теперь логирование настроено. После запуска сервера HAProxy появится лог-файл /var/log/haproxy.log.
Запуск HAProxy
Запустите HAProxy на сервере haproxy-www:
sudo service haproxy restart
Теперь HAProxy поддерживает SSL-терминацию и балансировку нагрузки веб-серверов.
Дополнительные рекомендации
Чтобы серверы поддерживали только HTTPS, они должны прослушивать только слушают только свои внутренние IP-адреса на порт 80. В противном случае пользователи смогут получить доступ к веб-серверам через HTTP.
Попробуйте посетить haproxy-www с помощью HTTPS и HTTP. Убедитесь, что сайт переадресовывает подключения HTTP на HTTPS.
Заключение
HAProxy – надёжное решение для балансировки нагрузки и обработки SSL-подключений с высокой масштабируемостью.