# Развёртывание нескольких сайтов на VPS при помощи Docker
# Введение
VPS — достаточно мощный и гибкий инструмент, способный поддерживать работу нескольких сайтов или веб-приложений одновременно. В этой инструкции мы расскажем, как на одном VPS запустить два сайта, используя при этом только Nginx (в качестве реверс-прокси) и Docker, в контейнерах которого будут работать наши сайты.
В общем случае количество сайтов или веб-приложений на одном VPS может быть любым — всё зависит только от мощности созданного сервера. В нашем примере мы используем CMS Ghost из-за простоты её развёртывания, чтобы не загромождать текст лишними деталями. Для запуска WordPress в Docker у нас есть отдельная инструкция.
Нам понадобится только зарегистрированный домен и готовый к работе VPS.
# Описание
По умолчанию сайт использует на сервере порты 80 и 443 для HTTP- и HTTPS-подключения к сети. При создании нескольких сайтов на одном сервере логичным образом возникает вопрос адресации запросов, поступающих на один порт. Как определить, какой запрос обращается к site1.example.com, а какой – к site2.example.com?
Обычно эта задача решается с помощью реверс-прокси. Мы для этого будем использовать Nginx.
Реверс-прокси проверяет поступающие запросы, анализирует их DNS-записи и перенаправляет обращения к site1.example.com на Docker-контейнер сайта1, а обращения к site2.example.com — на контейнер сайта2.
# Установка программного обеспечения (опционально)
Сначала установим Nginx и Docker. Образ CMS Ghost мы получим уже в процессе создания Docker-контейнеров.
Для VPS на Джино можно установить Nginx и Docker при создании нового сервера, выбрав нужные опции в разделе «Приложения». Если ваш VPS уже создан, можно воспользоваться пунктом меню УправлениеПакеты приложений.
В общем же случае установить Nginx и Docker можно из официальных репозиториев Ubuntu и Docker.
# Установка Nginx
Сначала обновим базы данных APT:
sudo apt update
После обновления можно установить веб-сервер:
sudo apt install nginx
Настроим фаервол для работы веб-сервера:
sudo ufw app list
В открывшемся списке приложений мы увидим:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Разрешения фаервола обычно настраиваются таким образом, чтобы максимально ограничить доступ к серверу. В нашем случае мы откроем доступ только одному из вариантов веб-сервера:
sudo auf allow "Nginx HTTP"
# Docker
Загружать Docker мы будем с его официального репозитория, поэтому нам понадобится несколько дополнительных операций, прежде чем приступить непосредственно к установке.
Для начала установим несколько дополнительных программных пакетов, которые позволят APT устанавливать пакеты через HTTPS:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Теперь установим ключ GPG для официального репозитория Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Теперь добавим репозиторий Docker в источники APT:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Обновим базы данных APT, чтобы репозиторий Docker попал туда:
sudo apt update
Теперь можно переходить к установке самого Docker:
sudo apt install docker-ce
После окончания установки можно проверить статус работы Docker:
sudo systemctl status docker
# Реализация
# Настройка Docker
Реализацию нашего проекта начнём с создания внутренней сети Docker:
sudo docker network create MyNetwork
Получим образ CMS Ghost:
sudo docker pull ghost
Создадим отдельные контейнеры для наших сайтов:
sudo docker run -dit --name site1.example.com --network MyNetwork ghost
sudo docker run -dit --name site2.example.com --network MyNetwork ghost
Теперь узнаем IP адреса, привязанные к контейнерам. Вводим команду:
docker inspect site1.example.com | grep IPAddress
Она должна выдать примерно такой результат:
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.18.0.2",
Аналогично для второго контейнера:
docker inspect site2.example.com | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.18.0.3"
# Настройка реверс-прокси
После того как мы получили IP-адреса контейнеров, можно переходить к настройке реверс-прокси.
Запустим Nginx:
systemctl enable --now nginx
Проверим, что DNS-записи наших доменных имён указаны верно. Для этого через браузер зайдём на site1.example.com и site2.example.com. Для обоих сайтов мы должны увидеть одну и ту же стартовую страницу Nginx.
Добавим два конфигурационных файла — по одному файлу на каждый сайт — в папку /etc/nginx/conf.d. Названия конфигурационных файлов должны заканчиваться на .conf.
Файлы будем создавать с помощью текстового редактора vim. Вы можете воспользоваться своим привычным редактором. Если ваш VPS на Джино, и предустановлена панель управления, файлы можно создавать в разделе УправлениеФайловый менеджер.
Создаём первый файл:
vim /etc/nginx/conf.d/site1.example.com.conf
Текст конфигурационного файла для первого сайта:
server {
listen 80;
listen [::]:80;
server_name site1.example.com;
location / {
proxy_pass http://172.18.0.2:2368;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
}
}
Второй сайт создаётся аналогично:
vim /etc/nginx/conf.d/site2.example.com.conf
Текст конфигурационного файла для второго сайта:
server {
listen 80;
listen [::]:80;
server_name site1.example.com;
location / {
proxy_pass http://172.18.0.3:2368;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
}
}
Важно помнить, что в конфигурационных файлах в качестве имени сервера указывается имя нашего домена, а порты, к которым обращается реверс-прокси, могут быть разными. В нашем примере CMS Ghost использует порт 2368, но в общем случае порт, который слушает веб-приложение, нужно искать в его технической документации.
Проверим правильность конфигурации. Вводим команду:
sudo nginx -t
Она должна выдать такой результат:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Перезагрузим наш реверс-прокси для применения конфигурации:
sudo systemctl reload nginx
Теперь, если всё было сделано правильно, при входе на site1.example.com и site2.example.com мы увидим стартовую страницу CMS Ghost.
# Заключение
Наши сайты работают, и можно переходить к организации безопасного подключения к ним. В нашем случае подключать SSL-сертификат нужно к реверс-прокси. Он будет получать шифрованный трафик, расшифровывать его и передавать дальше запросы к сайтам в уже незашифрованном виде.
В общем случае — когда реверс-прокси и сайты, которые он обслуживает, находятся на разных серверах — подобное решение недопустимо, поскольку незашифрованный трафик между реверс-прокси и сайтом может быть перехвачен. Но в нашем случае сайты и их реверс-прокси расположены на одном VPS, и угроз перехвата нешифрованного трафика нет.