Всем привет. Недавно я настроил установку Discourse с использованием AWS CloudFront (CF) для полной ускорения сайта и выгрузки SSL с помощью сертификатов AWS в CF. Обратите внимание, что эта установка отклоняется от официального руководства в отношении конфигурации CDN и SSL — поэтому это может быть спорным и привести к будущим проблемам с поддержкой. Так что будьте предупреждены… здесь водятся драконы. Я делюсь здесь конфигурацией, которая сработала для меня:
-
Настройте Discourse на прослушивание только порта 80 и отключите Let’s Encrypt, закомментировав указанные строки в файле app.yml:
-
Настройте Discourse на использование заголовка CF cloudfront-forwarded-proto вместо x-forwarded-proto (который CF не передаёт — и, странно, его нельзя настроить на передачу источнику… черт возьми!
)
-
Настройте распределение CF с CNAME для вашего предполагаемого публичного имени хоста (например, forum.example.com), используя сертификат AWS ACM (который вы создали).
-
Настройте источник CF, используя публичный Elastic IP сервера EC2, на котором размещён Discourse (например, ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com). Настройте его только для HTTP (то есть порт 80, без 443). Вам не нужно настраивать источник с красивым именем хоста в DNS, например forum-origin.example.com. Имя хоста EC2 или IP отлично работают.
-
Настройте «поведения» (behaviors) CF для различных путей запросов. Ключевое здесь — настроить поведение кэширования для явно статических ресурсов и настроить отсутствие кэширования для всего остального (то есть эти запросы просто передаются как есть источнику без кэширования). Ещё один важный момент: последнее правило передачи («по умолчанию») использует пользовательскую «политику запросов к источнику», которая передаёт все оригинальные заголовки источнику в дополнение к заголовку CF cloudfront-forwarded-proto. Также настройте перенаправление с HTTP на HTTPS в ваших поведенческих правилах, чтобы все запросы пользователей принудительно обрабатывались через HTTPS в CF.
-
Не настраивайте переменную окружения “DISCOURSE_CDN_URL”.
-
Включите опцию “force https”.
-
Не настраивайте “long polling base url” — оставьте её пустой. Несмотря на все мрачные предупреждения о том, что это может быть проблематично при пропускании через прокси, у меня это пока работает отлично. Возможно, стандартное время удержания соединения (keep-alive) в CF достаточно велико, чтобы предотвратить разрыв соединения.
Думаю, это всё… ![]()
В результате все запросы, HTTP-документы, все вспомогательные статические ресурсы, все AJAX-вызовы и т.д. обслуживаются на одном и том же доменном имени (например, forum.example.com). Поведение кэширования (и поведение передачи) определяется вашими «поведениями», настроенными в CF. Все соединения зашифрованы с использованием сертификатов AWS ACM, завершённых на границе CF, а затем незашифрованный/HTTP-трафик отправляется обратно на сервер источника.
Скажу прямо: это может быть даже чище, чем то, что сейчас реализовано на meta.discourse.org
.


