Всем привет,
Я изучил документацию, ознакомился с рекомендациями по настройке конфигурации, которые были опубликованы, и попытался адаптировать их под свою уникальную ситуацию.
Для задачи, которая кажется довольно простой, невероятно раздражает тот факт, что ни одно из предложенных решений не сработало.
Наша среда:
- Мы используем экземпляр 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 будет следующим призом.
С наилучшими пожеланиями,
Мэтью Лукас



