Эта тема является дополнением к другой, которая посвящена конфигурации Discourse. Здесь мы настроим дистрибуцию CloudFront в качестве обратного прокси-сервера перед Discourse.
Вам нужна эта комбинация только в том случае, если у вас уже есть дистрибуция CloudFront для основного доменного имени, и вы хотите проксировать подпапку на форум Discourse. В этом руководстве предполагается, что у читателя есть предыдущий опыт использования CloudFront в производственной среде.
Поток трафика
Когда пользователь загружает сайт, задействованы два сетевых соединения. У каждого из них разное доменное имя:
- Веб-браузер отправляет запрос в CloudFront для публичного доменного имени.
- Затем CloudFront отправляет запрос на серверы Discourse для доменного имени источника.
.───────. .───────. .─────────.
( browser )───▶( CF )───▶( discourse )
`───────' `───────' `─────────'
Для нашего примера мы предположим, что ваш сайт Discourse будет загружаться с https://www.example.com/forum/, используя:
| назначение | доменное имя |
|---|---|
| публичное доменное имя | www.example.com |
| доменное имя источника | discourse.example.com |
Настройка CloudFront
Это означает, что будет определено как минимум два источника — один по умолчанию для основного сайта и второй для серверов Discourse.
Также будет как минимум два правила поведения (behavior), каждое из которых указывает на свой источник.
Правило поведения и источник по умолчанию не имеют значения для наших целей здесь; они уже должны быть настроены в соответствии с вашими потребностями. Источник и правило поведения, специфичные для Discourse, должны быть настроены следующим образом.
Источник
Второй источник для серверов Discourse должен указывать на доменное имя источника.
Не настраивайте путь источника.
Политика протокола должна быть HTTPS, с минимальной версией TLSv1.
Правило поведения
Шаблон должен соответствовать подпапке.
Оно должно быть привязано к источнику, настроенному выше.
Оно должно перенаправлять HTTP → HTTPS.
Оно должно разрешать все HTTP-методы.
Оно должно отключить кэширование.
Оно должно пересылать все заголовки клиента.
Настройка Lambda@Edge
Среда общего хостинга (включая discourse.org) использует SNI. Чтобы это работало с CloudFront, вам нужно использовать Lambda@Edge, чтобы убедиться, что CloudFront использует доменное имя источника для SNI, а не заголовок Host из запроса зрителя.
Перейдите на панель управления AWS Lambda и создайте новую функцию. Используйте среду выполнения Node.js и создайте новую роль с разрешениями “Basic Lambda@Edge permissions”:
Нажмите “Create Function” (Создать функцию).
После появления редактора кода замените пример следующим кодом:
exports.handler = async (event, context) => {
const request = event.Records[0].cf.request;
request.headers['x-forwarded-host'] = [{
key: 'x-forwarded-host',
value: request.headers['host'][0]['value']
}];
request.headers["host"] = [{
key: 'host',
value: request.origin.custom.domainName
}];
return request;
};
Нажмите “Deploy” (Развернуть).
В левом верхнем углу выберите Actions → Deploy to Lambda@Edge.
Выберите ваш дистрибутив CloudFront и правильное правило поведения из списка:
Если вам по какой-либо причине нужно внести изменения, обязательно нажмите “Deploy” (Развернуть), затем “Publish new Version” (Опубликовать новую версию) на вкладке версий, а затем обновите ваш дистрибутив для использования новой версии Lambda.













