Настройка Discourse: окружение AWS Linux 2 AMI и Apache2 (httpd)

Всем привет,

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

Для задачи, которая кажется довольно простой, невероятно раздражает тот факт, что ни одно из предложенных решений не сработало.

Наша среда:

  • Мы используем экземпляр AWS EC2, а именно образ AWS Linux 2 AMI;
  • У нас запущен и настроен Apache2;
  • Экземпляр входит в группу целевых объектов (target group) AWS, на которую ссылается наш балансировщик нагрузки AWS;
  • Наш SSL/TLS сертификат предоставлен AWS и связан с балансировщиком нагрузки;
  • Наш провайдер доменов — name.com;
  • В рамках нашей настройки у нас есть несколько поддоменов, маршрутизация которых осуществляется через записи CNAME, все они указывают на балансировщик нагрузки AWS, который, в свою очередь, управляет трафиком к экземпляру EC2;
  • Весь трафик, проходящий через балансировщик нагрузки и обслуживаемый для веб-пользователя, защищен;
  • На нашем сервере запущено три отдельных приложения Node Express;
  • Порты определены в Express как часть настройки сервера Express; в настоящее время это порты 3000, 4000 и 5000;
  • Трафик маршрутизируется Apache с использованием поддомена к соответствующему веб-приложению, например:
<VirtualHost *:80>
    ServerName subdomain.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • Хотя это не особенно важно, мы используем PM2 для управления нашими приложениями Express, чтобы они автоматически запускались при перезагрузке сервера.

  • На том же сервере установлен Docker;

  • Затем мы также установили Discourse, используя копию app.yaml (используя Run other websites on the same machine as Discourse - #182 by angus в качестве руководства).

Текущий статус:

  • Docker запущен
  • Приложение Discourse (контейнер) запущено
  • Приложения Express все запущены и правильно маршрутизируются Apache

Заметки:

  • Сначала я пытался собрать приложение, не открывая порты, как указано в документации. Когда это не сработало, я открыл порт 8000 поверх HTTP-порта 80;
  • В моем простом понимании Docker — это как дом, а различные контейнеры — это комнаты. Docker определяет, как получить доступ к приложению, то есть какую «комнату» использовать. Моя идея заключалась в том, что, открыв порт 8000, я смогу обращаться к порту 8000 так же, как к другим моим приложениям Express, теперь что порт 8000 открыт. Но это не работает. Ниже приведен пример того, что я попытался сделать в Apache:
# FAQ (МАРШРУТЫ DISCOURSE)

<VirtualHost *:80>
    ServerName discourse.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8000/"
    ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>
  • Простой тест заключался в том, чтобы ввести localhost:8000 в браузере на самом сервере и проверить. Сервер — это экземпляр AWS с установленным Chromium. Тот факт, что это не resolves сразу, говорит мне о том, что есть проблема и что мое понимание чего-то фундаментального неполно. Мои веб-приложения работают и доступны на портах, которые я указываю в настройках Express; я ожидал, что с контейнером Docker будет то же самое.

Дополнительные заметки:

  • Я понимаю, что существует потенциальное решение: разместить NGINX «перед» Apache и Docker для маршрутизации трафика от discourse.domain.io к порту 8000 на локальном сервере, то есть к порту, открытому для контейнера Docker, а также маршрутизировать весь остальной трафик от *.domain.io к Apache на порту, скажем, 9000, а затем изменить конфигурацию виртуального хоста для маршрутизации трафика с порта 9000 соответствующим образом, то есть:
# МАРШРУТИЗАЦИЯ ПРИЛОЖЕНИЙ EXPRESS В APACHE

<VirtualHost *:9000>
    ServerName other_sub_domains.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • Для меня это кажется совершенно излишним. Если домен discourse.domain.io маршрутизируется к Apache, и Apache получает запрос, а затем пытается его маршрутизировать, должно быть так же просто, как указать на открытый порт контейнера Docker.
  • Кроме того, если localhost:8000 на самом сервере не resolves, то это решение все равно не сработает.

В настоящее время при попытке перейти к контейнеру Docker с моим Discourse в Chrome возникает ошибка 502. (См. скриншот выше).

Выдержка из app.yml

## Это шаблон контейнера Docker Discourse «все в одном» для автономной работы
##
## После внесения изменений в этот файл вы ДОЛЖНЫ выполнить пересборку
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ ИЛИ ВЫРАВНИВАНИИ!
## посетите http://www.yamllint.com/, чтобы проверить этот файл по мере необходимости

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## Какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse разделял порт с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
expose:
  - "8000:80"   # http
  #- "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Установите db_shared_buffers максимум на 25% от общего объема памяти.
  ## будет установлено автоматически при загрузке на основе обнаруженной оперативной памяти, или вы можете переопределить
  #db_shared_buffers: "256MB"

  ## может улучшить производительность сортировки, но увеличивает использование памяти на соединение
  #db_work_mem: "40MB"

  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и ядер CPU.
  ## будет установлено автоматически при загрузке на основе обнаруженных процессоров, или вы можете переопределить
  #UNICORN_WORKERS: 3

  ## TODO: Имя домена, на которое будет реагировать этот экземпляр Discourse
  ## Обязательно. Discourse не будет работать с чистым IP-адресом.
  DISCOURSE_HOSTNAME: 'discourse.domain.io'

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (-h опция), что и указано выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
  ## при первоначальной регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'user@domain.io'

  ## TODO: SMTP-сервер электронной почты, используемый для проверки новых учетных записей и отправки уведомлений
  ## Адрес SMTP, имя пользователя и пароль обязательны
  ## ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
  DISCOURSE_SMTP_ADDRESS: email-smtp.us-east-1.amazonaws.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: ******
  DISCOURSE_SMTP_PASSWORD: ******
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (опционально, по умолчанию true)
  #DISCOURSE_SMTP_DOMAIN: ******    # (требуется некоторыми провайдерами)
  #DISCOURSE_NOTIFICATION_EMAIL: ******  # (адрес для отправки уведомлений)

  ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## Адрес CDN http или https для этого экземпляра Discourse (настроен на извлечение)
  ## см. https://meta.discourse.org/t/14857 для деталей
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## Ключ лицензии IP-адреса Maxmind для поиска по IP-адресу
  ## см. https://meta.discourse.org/t/-/137387/23 для деталей
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Контейнер Docker не имеет состояния; все данные хранятся в /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Плагины идут здесь
## см. https://meta.discourse.org/t/19157 для деталей
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Любые пользовательские команды для запуска после сборки
run:
  - exec: echo "Начало пользовательских команд"
  ## Если вы хотите установить адрес электронной почты «От» для вашей первой регистрации, раскомментируйте и измените:
  ## После получения первого письма о регистрации закомментируйте строку снова. Она должна выполниться только один раз.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Конец пользовательских команд"

Мой домен, адрес электронной почты и конфигурация почты верны. Как уже упоминалось, мне не требуется настройка SSL/TLS.

Запрос:

  • Является ли решение с NGINX единственным способом заставить эту настройку работать, и если да, то есть ли более четкое объяснение шагов настройки? Я не могу начать с чистого сервера только для того, чтобы заставить Discourse работать, и без гарантий.
  • В Discourse behind reverse proxy and https - #2 by itsbhanusharma @Dark Matter предоставил следующее решение для Apache2, но я не думаю, что это решение учитывает среду Node Express, и с моим localhost:8000, который не resolves, я не уверен, что это сработает:
<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName  discourse.example.com
  DocumentRoot /website/discourse

  RewriteEngine On
  ProxyPreserveHost On
  ProxyRequests Off
  ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ErrorLog /var/log/apache2/discourse.error.log
  LogLevel warn
  CustomLog /var/log/apache2/discourse.access.log combined

  RewriteCond %{SERVER_NAME} =discourse.example.com
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
  • Проблема здесь в моей конфигурации Discourse? Возможно, проблема в маршрутизации Apache (я так подозреваю)? Или я упускаю что-то более фундаментальное?
  • Я считаю, что решение этой проблемы поможет многим пользователям в будущем.
  • Первый приз — маршрутизация к Discourse локально на сервере.
  • Затем маршрутизация через URL будет следующим призом.

С наилучшими пожеланиями,
Мэтью Лукас

Это слишком сложно для полного понимания, поэтому воспринимайте это скорее как догадку, чем как готовое решение. Если проблема в том, что вы не можете подключить что-либо к вашему работающему контейнеру Docker через localhost, попробуйте использовать IP-адрес Docker. Также возможно использовать шаблон веб-сокетов и работать через сокет вместо порта. Некоторые считают, что это предпочтительнее по ряду причин.

Мнение MKJ о конфигурации развёртывания Discourse может быть полезным для чтения.

@pfaffman@Matthew_Lucas уже использует шаблон с сокетами, хотя…

Я определённо использую localhost для своего внешнего прокси, и это должно работать с настройкой expose. Я не ожидаю, что ему потребуется использовать IP-адрес Docker. И я не ожидаю, что из-за этого будет происходить сбой только в случае, когда перед контейнером Docker стоит Apache.

Возможно, вам потребуется конфигурация заголовков — см. Add an offline page to display when Discourse is rebuilding or starting up - #2 by codinghorror

Я стараюсь как можно больше забыть о конфигурации Apache, но этот раздел конфигурации nginx — это то, что, как мне кажется, вам нужно будет воспроизвести в Apache.

    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;

В частности, я не думаю, что это будет работать правильно без заголовка Host.

Поскольку вы не используете HTTPS, вы должны иметь возможность использовать tcpdump для захвата трассировок пакетов, чтобы точно увидеть, что идёт не так.

Однако зачем вообще добавлять Apache? Это лишний шаг. Если бы я пытался что-то подобное, я бы настроил балансировщик нагрузки Amazon для прямого обращения к порту 8000 на экземпляре EC2. Я предполагаю, что вы всё равно завершаете HTTPS на ELB. Подозреваю, что их балансировщик нагрузки знает, какие обычные заголовки добавлять, без необходимости указывать их вручную, но если нет — конечно, настройте их сами. Просто убедитесь, что порт доступен через фаервол.

Сомневаюсь, что у меня есть что-то ещё ценное, что можно добавить здесь, но надеюсь, что хотя бы часть этого поможет вам с конфигурацией. Удачи.

УСТАНОВКА DOCKER И DISCOURSE НА AWS EC2 LINUX С СУЩЕСТВУЮЩИМ ОБРАТНЫМ ПРОКСИ-СЕРВЕРОМ HTTPD

Всем привет

Я разобрался. Я вернулся к чертежной доске и начал заново с чистой установкой Docker и Discourse. Мой процесс подробно описан ниже:

Предположения

• У вас уже есть экземпляр AWS EC2 Linux
• Вы можете получить доступ к своему экземпляру EC2 через SSH
• Apache 2 уже настроен и запущен на вашем сервере

ПОЛУЧЕНИЕ ДОСТУПА К ЭКЗЕМПЛЯРУ EC2 ЧЕРЕЗ SSH

  1. Откройте командную строку (CMD) или терминал

  2. Подключитесь к экземпляру AWS EC2 через SSH

Пример экрана после подключения к экземпляру EC2

ВЫПОЛНЕНИЕ ОБНОВЛЕНИЙ СИСТЕМЫ

  1. Выполните обновления системы, запустив следующую команду в консоли / терминале

$ sudo yum update

УСТАНОВКА DOCKER

  1. Найдите пакет Docker для AWS, запустив следующую команду в консоли / терминале

$ sudo yum search docker

  1. Получите информацию о версии, запустив следующую команду в консоли / терминале

$ sudo yum info docker

  1. Установите Docker, запустив следующую команду в консоли / терминале

$ sudo yum install docker

  1. Добавьте членство в группу для пользователя ec2-user по умолчанию, чтобы вы могли запускать все команды Docker без использования команды sudo, выполнив следующую команду в консоли / терминале
$ sudo usermod -a -G docker ec2-user
$ id ec2-user

# Перезагрузите назначения групп пользователя Linux для docker без выхода из системы

$ newgrp docker
  1. Установите docker-compose, запустив следующую команду в консоли / терминале
# 1. Получите pip3 (пакет установщика python)
$ sudo yum install python3-pip
 
# 2. Затем выполните любую из следующих команд
$ sudo pip3 install docker-compose # с правами root
 
# ИЛИ
 
$ pip3 install --user docker-compose # без прав root по соображениям безопасности

# Проверьте разрешения
$ sudo chmod -v +x /usr/local/bin/docker-compose
  1. Включите автоматический запуск службы Docker при загрузке, выполнив следующую команду в консоли / терминале

$ sudo systemctl enable docker.service

  1. Запустите службу Docker, выполнив следующую команду в консоли / терминале

$ sudo systemctl start docker.service

  1. Проверьте, запущена ли служба Docker, выполнив следующую команду в консоли / терминале; вывод будет выглядеть примерно так

Базовые команды Docker, которые полезно знать:

# Версия Docker
$ docker version

# Версия Docker Compose
$ docker-compose version

# Запуск службы Docker
$ sudo systemctl start docker.service

# Остановка службы Docker
$ sudo systemctl stop docker.service

# Перезапуск службы Docker
$ sudo systemctl restart docker.service

# Статус службы Docker
$ sudo systemctl status docker.service

УСТАНОВКА DISCOURSE

  1. Создайте папку discourse

$ sudo mkdir /var/discourse

  1. Клонируйте образ Docker Discourse в только что созданную директорию

$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse

  1. Скопируйте файл standalone.yml в папку containers

$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml

  1. Отредактируйте новый файл discourse.yml следующим образом (важные моменты: открытые порты для HTTP и детали электронной почты для SMTP; измените их в файле, не копируйте и не вставляйте)

Варианты редактирования:

1. Вы можете использовать nano и редактировать через командную строку / терминал
2. На AWS, если вы используете MATE с PLUMA, вы можете использовать PLUMA для редактирования файла
3. Вы можете использовать WINSCP для подключения к машине через SSH и редактирования файла через графический интерфейс Windows

## это шаблон контейнера Docker Discourse «все в одном» (standalone)
##
## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ ИЛИ ВЫРАВНИВАНИИ!
## посетите http://www.yamllint.com/, чтобы проверить этот файл при необходимости

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Раскомментируйте следующую строку, чтобы включить прослушивание IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал порт совместно с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
expose:
  - "8080:80"   # http (запуск на локальном порту 8080, порт Docker 80)
  #- "443:443" # https (убедитесь, что это закомментировано)

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Установите db_shared_buffers максимум в 25% от общего объема памяти.
  ## будет установлено автоматически при загрузке на основе обнаруженной оперативной памяти, или вы можете переопределить
  #db_shared_buffers: "256MB"

  ## может улучшить производительность сортировки, но увеличивает использование памяти на соединение
  #db_work_mem: "40MB"

  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и ядер процессора.
  ## будет установлено автоматически при загрузке на основе обнаруженных процессоров, или вы можете переопределить
  #UNICORN_WORKERS: 3

  ## TODO: Доменное имя, на которое будет реагировать этот экземпляр Discourse
  ## Обязательно. Discourse не будет работать с чистым IP-адресом.
  DISCOURSE_HOSTNAME: 'faq.mobiloan.io'

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (опция -h), указанным выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список разделенных запятыми адресов электронной почты, которые станут администраторами и разработчиками
  ## при первоначальной регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: «введите здесь email»

  ## TODO: SMTP-сервер электронной почты, используемый для проверки новых учетных записей и отправки уведомлений
  ## SMTP-адрес, имя пользователя и пароль обязательны
  ## ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
  DISCOURSE_SMTP_ADDRESS: ВВЕДИТЕ SMTP ЗДЕСЬ
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: ВВЕДИТЕ ИМЯ ПОЛЬЗОВАТЕЛЯ ЗДЕСЬ
  DISCOURSE_SMTP_PASSWORD: ВВЕДИТЕ ПАРОЛЬ ЗДЕСЬ
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (опционально, по умолчанию true, мы используем Amazon SES)

 

  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (требуется некоторыми провайдерами)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (адрес для отправки уведомлений)

  ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## Адрес http или https CDN для этого экземпляра Discourse (настроен на получение)
  ## см. https://meta.discourse.org/t/14857 для деталей
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## Ключ IP-адреса геолокации maxmind для поиска по IP-адресу
  ## см. https://meta.discourse.org/t/-/137387/23 для деталей
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Контейнер Docker не имеет состояния; все данные хранятся в /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Плагины идут здесь
## см. https://meta.discourse.org/t/19157 для деталей
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Любые пользовательские команды для запуска после сборки
run:
  - exec: echo "Начало пользовательских команд"
  ## Если вы хотите установить адрес электронной почты «От» для вашей первой регистрации, раскомментируйте и измените:
  ## После получения первого письма о регистрации снова закомментируйте строку. Она должна быть выполнена только один раз.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Конец пользовательских команд"
  1. После редактирования и сохранения файла выполните пересборку приложения Discourse, используя следующую команду в терминале

$ /var/discourse/launcher rebuild discourse

Примечание: если ваш yaml-файл называется иначе, замените discourse на имя вашего yaml-файла.

Обратите внимание, что пересборка занимает время.

  1. После пересборки ваше приложение должно работать на порту 8080. Чтобы проверить это, выполните следующую команду в терминале

$ sudo lsof -i -P -n | grep LISTEN

Пример вывода портов

Обратите внимание, что Docker слушает порт 8080, а httpd (Apache) слушает порт 80.

Что касается маршрутизации трафика: Apache будет получать веб-запросы и, при необходимости, перенаправлять их в контейнер Discourse на порт 8080.

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

КОНФИГУРАЦИЯ ВИРТУАЛЬНОГО ХОСТА APACHE

  1. Конфигурационный файл Apache находится по адресу /etc/httpd/conf.d/00-virtualhosts.conf. httpd / apache / apache2 — это разные версии Apache. Ваши файлы могут находиться в других местах, если вы не используете службу httpd, но конфигурация виртуального хоста в этом случае будет такой же.

Варианты редактирования:

1. Вы можете использовать nano и редактировать через командную строку / терминал
2. На AWS, если вы используете MATE с PLUMA, вы можете использовать PLUMA для редактирования файла
3. Вы можете использовать WINSCP для подключения к машине через SSH и редактирования файла через графический интерфейс Windows

Отредактируйте файл /etc/httpd/conf.d/00-virtualhosts.conf, добавив следующее:

# FAQ (МАРШРУТЫ DISCOURSE)

<VirtualHost *:80>
  	ServerName  sub.domain.com
  	ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8080/"
    ProxyPassReverse "/" "http://localhost:8080/"
</VirtualHost>
  1. Вам нужно создать соответствующую DNS-запись CNAME, указывающую поддомен на ваш сервер AWS / балансировщик нагрузки.

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

Балансировщик нагрузки обрабатывает наш SSL/TLS через сертификат, предоставленный AWS.

Балансировщик нагрузки также перенаправляет трафик на экземпляр AWS.

Apache установлен на экземпляре AWS и перенаправляет трафик на наши:

  • Приложения Node Express
  • Приложение Docker / Discourse.

ЗАКЛЮЧЕНИЕ

Это лишь одно из решений, но именно оно сработало в нашей существующей настройке.

Большое спасибо:

@Kane York за его статью о Discourse,
@Axel Fernandes за его статью на Medium, его заметки о загрузке необходимых файлов Discourse и
@Vivek Gite из nixCraft и его статью на cyberciti об установке Docker на AWS Linux 2.