# Развёртывание нескольких сайтов на 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, и угроз перехвата нешифрованного трафика нет.