Правильная настройка Docker для нескольких веб-сайтов

Мне интересно, какой правильный поток для установки для размещения нескольких веб-сайтов с использованием простого стека LEMP. Предположим, у меня есть виртуальная машина от Digital Ocean. Я хочу разместить 3 веб-сайта на этой виртуальной машине. Чтобы принимать запросы, у меня есть либо контейнер HAproxy, либо контейнер виртуального хоста Nginx, стоящий впереди. Это затем направляет определенные запросы в стек контейнеров, который обрабатывает приложение.

Запросы => Nginx/HAproxy =>

(website1.com) => (Nginx, php-fpm, стек mysql)

(website2.com) => (Nginx, php-hpm, стек mysql)

(website3.com) => (Nginx, php-hpm, стек mysql)

Если это правильная настройка, как мне масштабировать отдельные веб-сайты. Если веб-сайт 2 получает намного больше трафика и нуждается в большем количестве контейнеров, я бы увеличил весь стек (nginx, php-fpm, mysql) x2 или позволил контейнеру Nginx в начале баланса нагрузки стека между несколькими php-fpm экземпляры?

Website2.com => 1 (nginx, php-fpm, mysql) или 2 (nginx, php-fpm, mysql) с использованием циклического перебора.

OR

Website2.com => (nginx, php-fpm, php-fpm, php-fpm, mysql), где этот контейнер nginx обрабатывает циклический перебор между контейнерами php-fpm.

Еще одно примечание: где я могу разместить свои SSL-сертификаты для каждого веб-сайта? Я помещаю их в контейнер виртуального хоста HAproxy/Nginx, или у меня просто есть контейнер nginx в стеке.


person skilgarriff    schedule 13.02.2016    source источник
comment
На это действительно сложно ответить, тем более, что вы, кажется, задаете несколько вопросов одновременно. Я бы предложил разбить это на несколько более конкретных вопросов (по крайней мере, вопрос о том, следует ли совместно размещать nginx со стеком приложения и SSL отдельно). Также было бы полезно узнать, можете ли вы начать с нескольких серверов или нет, поскольку ответы могут определять, будут ли задействованы такие вещи, как Docker Swarm, оверлейные сети и концепции обнаружения. Как бы то ни было, на этот вопрос можно ответить по-разному.   -  person Andy Shinn    schedule 14.02.2016
comment
Что вы подразумеваете под запуском с несколькими серверами или нет?   -  person skilgarriff    schedule 14.02.2016


Ответы (1)


Прежде всего, имейте в виду, что контейнеры должны запускать один процесс, а не стеки. Хотя можно запустить похожий на init процесс, порождающий несколько процессов внутри одного контейнера, или даже что-то вроде Supervisord. для достижения этого, это не лучшая практика. Контейнеры предназначались для использования в качестве микросервисов.

Таким образом, без учета базы данных одним из возможных сценариев будет:

  1. несколько контейнеров приложений, по одному на каждый веб-сайт, с запущенным php-fpm;
  2. Один единственный контейнер веб-сервера, работающий с Nginx и включающий конфигурацию vhost для каждого веб-сайта и связанный со всеми вашими контейнерами приложений;
  3. Один единственный контейнер балансировщика нагрузки, запускающий все, что вы выберете в качестве решения для балансировки прокси, со всеми настройками, необходимыми для веб-сайтов, включая SSL.

Итак, я понимаю, что у вас должно быть как минимум 2 уровня: Load Balancer/Proxy -> Applications. Итак, 3) идет на верхнем уровне, а 1) и 2) идет на другом, которые должны работать на одном сервере.

Что касается службы базы данных, я не уверен, что это хороший выбор для запуска ее в контейнере. Вам нужно будет сопоставить каталог данных с хоста (поскольку контейнеры эфемерны, а ваши данные — нет), и не имеет смысла перемещать ваш контейнер на другие серверы без перемещения данных, поэтому контейнер кажется довольно бесполезно в данном случае. И в любом случае вы не будете использовать контейнер для развертывания, поэтому я не вижу в этом большого преимущества. Было бы лучше просто иметь еще один сервер для базы данных.

Что касается масштабирования, если вы решите запустить все сайты на одном сервере, у вас не будет особого выбора, кроме как масштабировать все вместе. Кроме того, вы можете разделить вещи по услугам. У вас будет группа компьютеров для каждого "микросервиса" (скажем, website1+nginx1, website2+nginx2 и т. д.). Таким образом, вы можете масштабировать каждую службу независимо, но это, вероятно, будет означать много накладных расходов и растраты ресурсов. Все зависит от того, насколько сложным вы считаете, что вам нужно получить.

На этот вопрос нелегко ответить, и нет правильного и неправильного, когда дело доходит до таких архитектур. Это просто вопрос решения, что является хорошим компромиссом для вас.

person Edson Marquezani Filho    schedule 14.02.2016
comment
Да, когда я говорил о стеке, я использовал его неформально для описания файла для создания докеров. То есть один стек - это 3 контейнера, один из nginx, php-fpm и т. д. Я понимаю, что мне, вероятно, понадобится лучший менеджер томов, если я собираюсь запускать mysql в контейнере, но я думаю, что меня больше волнует с масштабированием php-fpm, в отличие от масштабирования как nginx, так и php-fpm для одного и того же веб-сайта. - person skilgarriff; 16.02.2016
comment
Кроме того, не нужно ли мне больше одного контейнера nginx? В противном случае все мои файлы должны были бы находиться в этом контейнере, а не запускать отдельные контейнеры nginx для каждого приложения. - person skilgarriff; 16.02.2016
comment
Да, как я уже сказал, это зависит от того, как вы собираетесь разделить свои приложения. Если вы собираетесь запускать все на одном сервере, я бы предпочел иметь один контейнер Nginx со всеми конфигурациями, чем один Nginx на каждый сайт. Но другой подход — иметь для каждого веб-сайта пару Nginx+PHP-FPM, возможно, в одном контейнере. Таким образом, ваш контейнер становится более автономным и функциональным. Тебе решать. - person Edson Marquezani Filho; 16.02.2016