Настройка SSL-терминации на HAProxy в Ubuntu 14.04

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 может стать узким местом в производительности, если у него нет достаточного количества системных ресурсов для обработки такого трафика.

Требования

Создание 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-подключений с высокой масштабируемостью.

Tags: , , ,

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