Шаг за шагом с примером

Если у вас есть веб-сайт, размещенный на AWS EC2, и вы хотите создать для него поддомен, вы можете подумать, что вам нужно запустить еще один экземпляр EC2 и назначить ему другой IP-адрес. Однако есть более простой и экономичный способ сделать это: использовать записи CNAME на Route 53 и настроить nginx на вашем экземпляре EC2 для использования одного и того же IP-адреса.

В этом сообщении блога я покажу вам, как добавить субдомен, который использует тот же IP-адрес EC2, что и ваш основной домен, но обслуживается другим приложением. Таким образом, вы можете иметь несколько веб-сайтов, работающих на одном сервере, каждый со своим собственным поддоменом. Это полезно для создания целевых страниц, блогов, портфолио или любого другого веб-сайта, который вы хотите иметь под своим основным доменным именем.

Создать запись CNAME

Чтобы создать запись CNAME, которая сопоставляет ваш поддомен с вашим доменом, вам необходимо использовать консоль Amazon Route 53 или API.

Запись CNAME — это тип записи DNS, который позволяет направлять трафик к ресурсу, например веб-серверу, используя доменное имя вместо IP-адреса. Например, вы можете создать запись CNAME, которая сопоставляет blog.example.com с example.com, а затем настроить веб-сервер для обслуживания различных приложений на основе имени хоста.

Чтобы создать запись CNAME с помощью консоли Route 53, выполните следующие действия:

1. Войдите в Консоль управления AWS и откройте консоль Route 53 по адресу https://console.aws.amazon.com/route53/.
2. На панели навигации выберите Размещенные зоны.
3. На странице Размещенные зоны выберите имя размещенной зоны, в которой вы хотите создавать записи.
4. Выберите Создать запись.
5. Выберите Простая политика маршрутизации и введите следующие значения. :
— Имя записи: введите имя вашего субдомена, например blog.
— Тип записи: выберите CNAME.
— Значение: введите имя вашего домена, например, example.com.
6. Выберите Создать записи.

На следующем снимке экрана показан пример создания записи CNAME для subdomain.domain.com с помощью консоли Route 53:

Настроить Nginx

В этом разделе мы настроим Nginx для обслуживания приложений нашего домена и поддомена. Nginx — это веб-сервер, который также может выступать в качестве обратного прокси-сервера, балансировщика нагрузки и кэша HTTP. Мы будем использовать Nginx для передачи запросов от нашего домена и поддомена к соответствующим приложениям, работающим на разных портах в одном экземпляре EC2.

Чтобы настроить Nginx, нам нужно отредактировать файл nginx.conf, который обычно находится в каталоге /etc/nginx/ или /usr/local/nginx/. Вы можете использовать любой текстовый редактор по вашему выбору, например, nano, vim или emacs. Файл nginx.conf содержит различные директивы, управляющие поведением Nginx. Мы сосредоточимся на директивах server и location, которые определяют, как Nginx обрабатывает запросы для разных доменов и URL-адресов.

Файл nginx.conf должен выглядеть примерно так:

server {
  listen         80;
  server_name    www.domain.com domain.com;
  return 301 https://www.domain.com$request_uri;
}

server {
  listen         80;
  server_name    www.subdomain.domain.com subdomain.domain.com;
  return 301 https://www.subdomain.domain.com$request_uri;
}

server {
    server_name www.domain.com domain.com;

    listen 443 ssl;

    ssl_certificate <path/to/.crt>;
    ssl_certificate_key <path/to/.key>;

    location / {
        proxy_pass https://domain_app:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https; 
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}


server {
    server_name www.subdomain.domain.com subdomain.domain.com;

    listen 443 ssl;

    ssl_certificate <path/to/.crt>;
    ssl_certificate_key <path/to/.key>;

    location / {
        proxy_pass https://subdomain_app:8001;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https; 
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

Давайте разберем, что делает каждая директива:

  • Директива listen указывает номер порта, на котором Nginx прослушивает входящие запросы. В нашем случае у нас есть две директивы listen для каждого блока сервера: одна для порта 80 (HTTP) и одна для порта 443 (HTTPS).
  • Директива server_name указывает доменное имя или имена, на которые Nginx отвечает для каждого блока сервера. В нашем случае у нас есть две директивы server_name для каждого блока сервера: одна для версии с www и одна для версии без www нашего домена и поддомена.
  • Директива return отправляет ответ перенаправления клиенту с указанным кодом состояния и URL-адресом. В нашем случае мы используем return 301 для перенаправления всех HTTP-запросов на HTTPS как для нашего домена, так и для поддомена (директива return 301 в NGINX используется для выполнения постоянного перенаправления. Она сообщает клиенту, что запрошенный ресурс был навсегда перемещен на новый местоположение и предоставляет новый URL-адрес. Клиент должен использовать новый URL-адрес для всех будущих запросов к этому ресурсу1).
  • Директивы ssl_certificate и ssl_certificate_key указывают пути к SSL-сертификату и файлам ключей, которые Nginx использует для защиты HTTPS-соединения. Вам нужно заменить ‹path/to/.crt› и ‹path/to/.key› фактическими путями к вашему сертификату и файлам ключей.
  • Директива location определяет, как Nginx обрабатывает запросы на разные URL-адреса в блоке сервера. В нашем случае у нас есть одна директива местоположения для каждого блока сервера: location /, которая соответствует любому URL-адресу, начинающемуся с косой черты (/).
  • Блок местоположения в каждом блоке сервера настроен на прокси-запросы к указанным вышестоящим серверам приложений (domain_app:8000 и subdomain_app:8001) с использованием директивы proxy_pass. В среде Docker вы можете указать вышестоящий сервер в NGINX, используя имя службы контейнера. Это возможно, потому что Docker предоставляет внутренний преобразователь DNS, который может преобразовать имя службы контейнера в его IP-адрес. Чтобы контейнер NGINX мог разрешить имя службы контейнера приложений, оба контейнера должны быть подключены к одной и той же сети Docker. Этого можно добиться несколькими способами, в зависимости от того, как вы запускаете свои контейнеры. Если вы используете docker run для запуска своих контейнеров, вы можете создать пользовательскую сеть с помощью команды docker network create, а затем подключить к ней свои контейнеры, используя флаг --network при их запуске. Например:
# Create a user-defined network
docker network create my-network

# Start the app container and connect it to the network
docker run --name domain_app --network my-network ...

# Start the NGINX container and connect it to the network
docker run --name nginx --network my-network ...

Если вы используете docker-compose, вы можете определить пользовательскую сеть в файле docker-compose.yml и указать, что обе службы должны ее использовать. Например:

version: '3'
services:
  domain_app:
    ...
    networks:
      - my-network
  nginx:
    ...
    networks:
      - my-network
networks:
  my-network:

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

  • Директива proxy_set_header устанавливает или изменяет заголовок в запросе, отправляемом вышестоящему серверу или приложению. В нашем случае мы используем четыре директивы proxy_set_header для каждого блока местоположения:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

добавляет IP-адрес клиента в заголовок X-Forwarded-For, что полезно для ведения журнала и контроля доступа.

proxy_set_header X-Forwarded-Proto https

устанавливает для заголовка X-Forwarded-Proto значение https, что указывает на то, что запрос был сделан через защищенное соединение. Это полезно для приложений, которым необходимо знать, был ли запрос безопасным или нет.

proxy_set_header Host $host

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

proxy_redirect off

отключает любые перенаправления, выдаваемые вышестоящим сервером или приложением, что предотвращает любые конфликты с собственными перенаправлениями Nginx.

Краткое содержание

В этом сообщении блога мы узнали, как добавить поддомен, который использует тот же IP-адрес EC2, что и основной домен, но обслуживается другим приложением. Мы использовали AWS Route 53 для создания записи CNAME, которая сопоставляет субдомен с основным доменом, а затем мы изменили файл конфигурации nginx для обработки запросов для субдомена. Таким образом, мы можем размещать несколько приложений на одном экземпляре EC2 и использовать поддомены для доступа к ним.

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу