ОСНОВНОЕ

WORDPRESS

Операционные системы

Базы данных

Фреймворк Bootstrap

Когда рубят лес, летят щепки предательства (Авессалом Подводный).

Как организовать несколько веб-сайтов с Nginx и использование LXD в HAProxy на Ubuntu 16.04

FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Статья опубликована: 29 апреля 2017

Как организовать несколько веб-сайтов с Nginx и использование LXD в HAProxy на Ubuntu 16.04

Введение

Контейнер Linux представляет собой группировку процессов, которая изолирована от остальной части системы за счет использования функций безопасности ядра Linux, таких как пространств имен и контрольных групп. Это конструкция похожа на виртуальную машину, но это намного более легкая; вы не имеете накладные расходы на работу дополнительного ядра, или имитируя аппаратное обеспечение. Это означает, что вы можете легко создать несколько контейнеров на одном сервере. Используя контейнеры Linux, вы можете запускать несколько экземпляров целых операционных систем, на том же сервере, или связать приложение и его зависимости в контейнере, не затрагивая остальную часть системы.

Например, представьте, что у вас есть сервер и вы создали несколько сервисов, в том числе веб-сайтов, для ваших клиентов. В традиционной установке, каждый веб-сайт будет виртуальным хостом одного и того же экземпляра веб-сервера Apache или Nginx. Но с контейнерами Linux, каждый веб-сайт будет настроен в своем контейнере, со своим собственным веб-сервером.

Мы можем использовать LXD для создания и управления этими контейнерами. LXD предоставляет услугу гипервизора для управления всем жизненным циклом контейнеров.

В этой статье вы будете использовать LXD для установки двух Nginx на основе веб-сайтов на одном сервере, каждый в пределах своего контейнера. Тогда вы будете устанавливать HAProxy в третьем контейнере, который будет выступать в качестве обратного прокси-сервера. Затем пройдем маршрут движения к контейнеру HAProxy для того, чтобы сделать веб-сайты доступные из Интернета.

Предпосылки

Для выполнения этого гида вам понадобится следующее:

  • Один сервер Ubuntu 16.04, сконфигурированный, следуя учебнику попервоначальной настройки сервера с Ubuntu 16.04, с SUDO некорневым пользователем и брандмауэром.
  • Два Fully-Qualified Domain Names (FQDN), в каждом DNS запись A, указывающую на IP – адрес вашего сервера.
  • При желании можно добавить 20GB или более из блока хранения. Вы можете использовать его, чтобы хранить все данные, относящиеся к контейнерам.

Шаг 1 – Добавление пользователя в группуlxd

Войдите на сервер, используя учетную запись пользователя, не корень. Мы будем использовать эту учетную запись без пользователя, чтобы выполнить все задачи управления контейнером. Для того, чтобы работать, вы должны сначала добавить пользователя в группуlxd. Сделайте это с помощью следующей команды:

 

Выйдите из сервера и снова войдите в систему снова, чтобы ваш новый сеанс SSH обновился с новым составом группы. После того, как вы вошли в систему, вы можете приступить к настройке LXD.

Шаг 2 – Настройка LXD

LXD должен быть настроен должным образом, прежде чем использовать его. Самый важное решение конфигурации является тип бэкэнда хранения для хранения контейнеров. Рекомендуемое базовое для хранения LXD является файловая система ZFS, хранится либо в предопределенном файле или с помощью блока хранения. Для того, чтобы использовать поддержку ZFS в LXD, установите пакетzfsutils-linux:

 

Вариант 1 – Использование предопределенного файла

Выполните следующие действия для настройки LXD использовать предопределенный файл для хранения контейнеров. Во-первых, выполните следующую команду, чтобы запустить процесс инициализации LXD:

 

Вам будет предложено предоставить несколько частей информации, как показано в следующем выходе. Мы отберем все значения по умолчанию, в том числе предлагаемый размер для предопределенного файла, называется устройство цикла:

Вывод
 

Предлагаемый размер автоматически вычисляется из доступного дискового пространства сервера.

После того, как устройство сконфигурировано, вы будете конфигурировать сетевые настройки, которые мы рассмотрим после следующего дополнительного раздела.

Вариант 2 – Использование блока хранения

Если вы собираетесь использовать Block Storage, вам необходимо найти устройство, которое указывает на блок объемом памяти, который вы создали для того, чтобы указать его в конфигурации LXD. Перейдите к вкладке Volumesв панели управления, найдите volume, нажмите на More, а затем нажмите на Config instructions.

Найдите устройство, глядя на команду для форматирования. В частности, обратите внимание на путь, указанный в командеsudo mkfs.ext4 -F.

В нашем случае имя тома /dev/disk/by-id/scsi-0D0_Volume_volume-fra1-01, хотя ваш может отличаться.

После того, как вы определите объем, вернитесь к терминалу и введите следующую команду, чтобы начать процесс инициализации LXD.

 

Вам будет представлены ряд вопросов. Ответьте на вопросы, как показано в следующем выводе:

Вывод
 

При появлении запроса об использовании существующего блока устройства, выберите yesи укажите путь к вашему устройству:

Вывод команды “lxd init”
 

 

Затем используйте значение по умолчанию для остальных вопросов:

Вывод команды “lxd init”
 

 

После завершения процесса, вы будете настраивать сеть.

Настройка сети

Процесс инициализации представит нам серию экранов, как на рисунке ниже, которые позволяют нам настроить сетевой мост для контейнеров, таким образом они могут получить частные IP-адреса, общаться друг с другом, и иметь доступ к сети Интернет.

Используйте значение по умолчанию для каждого варианта, но на вопрос о подключении к сети IPv6, выберите NO, так как мы не будем использовать его в этом руководстве.

После завершения настройки сети, вы готовы создавать свои контейнеры.

Шаг 3 – Создание контейнеров

Мы успешно настроили LXD. Мы определили местонахождение бэкэнда хранения и настроили по умолчанию сеть для всех вновь создаваемых контейнеров. Мы готовы создавать и управлять некоторыми контейнеры, которые мы будем делать с командойlxc.

Давайте попробуем нашу первую команду, в которой перечислены доступные установленные контейнеры:

 

Вы увидите следующий вывод:

Вывод команды “lxd list”
 

Так как это первый раз, когда командаlxcвзаимодействует с LXD гипервизором, вывод позволяет нам знать, что команда автоматически создает сертификат клиента для безопасной связи с LXD. Затем он показывает некоторую информацию о том, как запустить контейнер. Наконец, команда показывает пустой список контейнеров, который, как и ожидается, мы еще не создали каких – либо контейнеров.

Давайте создадим три контейнера. Мы создадим один для каждого веб-сервера, и третий контейнер для обратного прокси-сервера. Цель обратного прокси-сервера, чтобы направлять входящие подключения из Интернета к правильному веб-серверу в контейнере.

Мы будем использовать командуlxc launchдля создания и запуска Ubuntu 16,04 ( ubuntu:x) контейнера с именем myweb. Ярлык Х вubuntu:xэто первая буква, дружественных позывного Ubuntu 16.04. ubuntu:является идентификатором для предварительно настроенного хранилища LXD изображений.

Примечание : Вы можете найти полный список всех доступных изображений Ubuntu, запустив lxc image list ubuntu:и в других дистрибутивах, запустив lxc image list images:

Выполните следующие команды для создания контейнеров:

 

Здесь вы можете увидеть пример вывода от создания контейнера myweb.

Вывод
 

Теперь, когда мы создали три пустые контейнеры, давайте используем команду lxc list для отображения информации о них:

 

Вывод покажет таблицу с именем каждого контейнера, его текущее состояние, его IP-адрес, его тип, и есть ли сделанные снимки.

Вывод
 

Обратите внимание на имена контейнеров и их соответствующие IPv4 адреса. Вы будете нуждаться в них, чтобы настроить свои услуги.

Шаг 4 – Настройка контейнера Nginx

Давайте соединимся с контейнером mywebи настроим первый веб – сервер.

Для подключения, мы используем командуlxc exec, которая принимает имя контейнера и команды для выполнения. Выполните следующую команду для подключения к контейнеру:

 

--строка означает , что параметры команды для lxcдолжны останавливаться, и будут переданы все остальные строки, так как команда должна быть выполнена внутри контейнера. Команда sudo --login --user ubuntu, обеспечивает оболочку входа для сконфигурированных аккаунтовubuntuвнутри контейнера.

Примечание:
Если вам необходимо подключить к контейнерам, как рroot, вы можете использовать команду lxc exec myweb — /bin/bash.

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

Вывод
 

Пользователь Ubuntu в контейнере имеет предварительно настроенный доступsudo, и может работать с командойsudoбез ввода пароля. Эта оболочка ограничена внутри границ контейнера. Все, что мы запускаем в этой оболочке остается в контейнере и не может уйти на хост – сервер.

Давайте обновим список пакетов экземпляра Ubuntu внутри контейнера и установим Nginx:

 

Давайте отредактируем веб – страницу по умолчанию для этого сайта и добавим некоторый текст, который даст понять, что этот сайт размещен в контейнереmyweb. Откроем файл /var/www/html/index.nginx-debian.html:

 

Выполните следующие изменения в файл:

Отредактированный файл /var/www/html/index.nginx-debian.html
 

Мы отредактировали файл в двух местах и , в частности добавлен текст on LXD container myweb. Сохраните файл и выйдите из редактора.

Теперь выйдите из контейнера и вернитесь обратно на хост-сервер:

 

Повторите эту процедуру для контейнераyouweb. Войдите, установите Nginx, а затем отредактируйте файл , /var/www/html/index.nginx-debian.htmlчтобы добавитьyouweb. Затем выйти из контейнераyouweb.

Давайте используем командуcurlчтобы проверить, что веб – серверы в контейнерах работают. Нам нужны IP – адреса веб – контейнеров, которые были показаны ранее.

 

Вывод должен быть:

Вывод команды “curl http://5.5.5.5.0/”
 

Проверьте второй контейнер, а также, используя командуcurlи его IP – адрес, чтобы проверить правильность установки. Если обои контейнеров настроены правильно, мы можем перейти к настройке HAProxy.

Шаг 5 – Настройка контейнера HAProxy

Мы создали HAProxy как прокси перед этими контейнерами. Мы будем направлять трафик каждого контейнера на основе доменного имени, который мы используем. Мы будем использовать домен example.ruв примере конфигурации, следует, что это специальный домен зарезервированный для документации, как этот учебник. Мы сделаем первый сайт доступным на именах хостов example.ruи www.example.ru. Второй сайт будет www2.example.ru. Подставьте свои собственные доменные имена вместо этих доменных имен.

Войдите в контейнерhaproxy:

 

Обновите списки пакетов установки и установите HAProxy:

 

После завершения установки, мы можем настроить HAProxy. Файл конфигурации для HAProxy находится в файле/etc/haproxy/haproxy.cfg. Откройте файл с помощью вашего любимого текстового редактора.

 

Во-первых, мы сделаем несколько изменений в разделdefaults. Мы добавим опциюforwardfor, чтобы мы могли сохранить реальный IP – адрес источника веб – клиента, и мы добавим опциюhttp-server-close, которая позволяет повторно использовать сеанс и более низкую латентность.

/etc/haproxy/haproxy.conf
 

Далее, мы настроим внешний интерфейс, чтобы указать два наши серверных контейнеры. Добавим новый разделfrontendпод названиемwww_frontendкоторый выглядит следующим образом:

/etc/haproxy/haproxy.conf
 

Эти командыaclсоответствуют именам хостов веб – серверов и будут перенаправлять запросы к соответствующему разделуbackend.

Затем мы определим два новых разделаbackend, по одному для каждого веб – сервера, и назовем их myweb_clusterи youweb_clusterсоответственно. Добавьте следующий код в файл, чтобы определить backends:

/etc/haproxy/haproxy.conf
 

Вариант balanceобозначает стратегию балансировки нагрузки. В этом случае мы выбираем наименьшее число соединений. Опцияhttp-requestустанавливает HTTP – заголовок с IP клиентом в режиме реального web client IP. Если мы не ставили этот заголовок, веб – сервер будет записывать HAProxy IP – адрес в качестве источника IP для всех соединений, что делает его более трудным для анализа, от куда ваш трафик происходит. Параметрserverуказывает произвольное имя для сервера ( myweb), а затем имя хоста и порт сервера ..

LXD предоставляет DNS – сервер для контейнеров, поэтому myweb.lxdразрешается в IP, связанный с контейнеромmyweb. Другие контейнеры имеют свои собственные имена хостов, такие как youweb.lxdи haproxy.lxd.

Параметр checkуказывает HAproxy выполнить проверку работоспособности на веб – сервере, чтобы убедиться, что он доступен.

Чтобы проверить, что конфигурация является допустимой, выполните следующую команду:

 

Вывод должен быть таким:

 

Давайте перезагрузим HAProxy так, чтобы он прочил новую конфигурацию.

 

Теперь выйдите из контейнера для того, чтобы вернуться обратно на хост.

 

Мы настроили HAProxy действовать в качестве обратного прокси – сервера, который пересылает любые соединения, которые он получает от порта 80на соответствующий веб – сервер в двух других контейнеров. Давайте сделаем тест, который на haproxyсамом деле удается направить запросы на правильный веб – контейнера. Выполните следующую команду:

 

Это делает запрос к HAProxy и устанавливает заголовок HTTP host, который HAProxy следует использовать для перенаправления подключения к соответствующему веб – серверу.

Вывод должен быть такой:

Вывод команды “curl –verbose –header ‘Host: youweb.example.ru’ http://5.5.5.5.”
 

HAProxy правильно понял запрос и направила его в контейнер youweb. Веб-сервер обслуживал индексную страницу по умолчанию, что мы редактировали ранее, и показывает текст на контейнере youweb. Теперь давайте зададим маршрут внешних запросов к haproxy, чтобы все могли зайти на наши веб-сайты.

Шаг 6 – Переадресация входящих подключений на контейнер HAProxy

Заключительная часть головоломки, чтобы подключить обратный прокси – сервер в Интернете. Нам нужно настроить наш сервер для передачи каких – либо соединений, которые он может получать из Интернета на порт 80в контейнерhaproxy.

HAProxy установлен в контейнере, и, по умолчанию, является недоступным из Интернета. Чтобы решить эту проблему, мы создадим правилоiptablesдля пересылки соединений.

Команда iptablesтребует два IP – адреса: публичный IP – адрес сервера ( your_server_ip) и частный IP – адрес контейнераhaproxy( your_haproxy_ip), который можно получить с помощью командыlxc list.

Выполните эту команду, чтобы создать правило:

 

Вот как команда переводиться:

  • -t natуказывает, что мы используем таблицуnat.
  • -I PREROUTING указывает, что мы добавляем правило в цепи PREROUTING.
  • -i eth 0определяет интерфейс eth0, который является публичным интерфейсом по умолчанию.
  • -p TCP говорит, что мы используем протокол ТСР.
  • -d your_server_ip/32 определяет IP-адрес назначения для правила.
  • --dport 80: Определяет порт назначения.
  • -j DNAT говорит, что мы хотим выполнить переход к месту назначения NAT (DNAT).
  • --to-destination your_haproxy_ip:80 говорит, что мы хотим, перейти на IP-адрес контейнера с HAProxy.

Наконец, чтобы сохранить командуiptablesтак, чтобы она повторно применяется после перезагрузки, мы установим пакетiptables-persistent:

 

При установке пакета, вам будет предложено сохранить текущие правила Iptables. Принять и сохранить все текущие правилаiptables.

Если вы создали два FQDNs, то вы должны иметь возможность подключения к каждому веб-сайту с помощью веб-браузера. Попробуйте это.

Для того, чтобы проверить доступность обоих веб-серверов из интернета, используйте командуcurl:

 

Эти команды HTTP подключаются к общественному IP – адресу сервера и добавленным полем заголовка HTTP с параметром --header, который HAProxy будет использовать для обработки запроса, так же как вы делали в шаге 5.

Вот выход из первой командыcurl:

Вывод
 

Вот вывод второй командыcurl:

Вывод
 

В обоих случаях, правильный сайт показывается.

Вывод

Вы создали два веб-сайта, каждый в своем контейнере, с управлением HAProxy. Вы можете повторить этот процесс, чтобы настроить многие другие веб-сайты, каждый в пределах своего контейнера.

Можно также добавить MySQL в новый контейнер, а затем установить CMS WordPress для запуска каждого веб – сайта. Вы также можете использовать этот процесс для поддержки старых версий программного обеспечения. Например, если установка CMS требует старую версию программного обеспечения, такую как PHP5, то вы можете установить Ubuntu 14.04 в контейнере ( lxc launch ubuntu:t), вместо того, чтобы пытаться понизить версию менеджера пакетов, доступных на Ubuntu 16.04.

Наконец, LXD дает возможность делать снимки полного состояния контейнеров, что позволяет легко создавать резервные копии и восстанавливать контейнеры обратно в более позднее время. Кроме того, если мы устанавливаем LXD на двух разных серверах, то можно соединить их и сделать миграцию контейнеров между серверами через Интернет.

 


Читайте также

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

Войти с помощью: 

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

Простая логическая игра "Поймай кота". Задача игры окружить кота точками так, чтобы он не смог убежать с поля. Постигла неудача - начни игру снова!

Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

badge
Обратный звонок 1
Отправить
galka

Спасибо! Ваша заявка принята

close
galka

Спасибо! Ваша заявка принята

close