Вопрос по amazon-s3, amazon-route53, amazon-web-services – Настройте виртуальные хосты nginx на сервере для маршрутизации в определенные папки.

2

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

на традиционном сервере, который работает следующим образом; у нас есть субдомен подстановочных знаков, * .domain.com, который маршрутизирует к nginx и обслуживает папку

поэтому myapp.domain.com> nginx> обслуживает папку приложения myapp> папка myapp содержит статический сайт

Я пытаюсь каким-то образом перенести это в AWS, мне нужно сделать аналогичную вещь в AWS, я играл с идеей поместить каждое статическое приложение в корзину s3, а затем подстановочный домен на маршруте 53, но я не знаете, как s3 узнает, какую папку использовать, поскольку эта функция не является частью маршрута 53

У кого-нибудь есть предложения?

Спасибо за вашу помощь

Ваш Ответ

2   ответа
5

Lambda @ Edge - это расширение CloudFront, которое позволяет представлять атрибуты запросов и ответов и управлять ими как простыми объектами JavaScript. Триггеры могут быть подготовлены к срабатыванию во время обработки запроса, либо до проверки кэша (триггер «запрос просмотра»), либо до того, как запрос переходит к серверной части («сервер-источник», в данном случае конечная точка размещения веб-сайта S3) после пропуска кэша (триггер «запрос источника») ... или во время обработки ответа, после получения ответа от источника, но до того, как он будет рассмотрен для хранения в кэше CloudFront (триггер «ответа источника»), или при завершении ответ браузеру (триггер «ответ зрителя»). Триггеры ответа также могут проверять исходный объект запроса.

Следующий фрагмент это то, что я изначальноотправил на форумах AWS. Это триггер исходного запроса, который сравнивает исходное имя хоста с вашим шаблоном (например, домен должен соответствовать*.example.com) и если это так, префикс имени хостаsubdomain-here.example.com Это запрос подается из папки с именем для субдомена.

lol.example.com/cat.jpg        -> my-bucket/lol/cat.jpg
funny-pics.example.com/cat.jpg -> my-bucket/funny-pics/cat.jpg

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

Для доступа к оригиналу входящегоHost заголовок, CloudFront должен быть настроен набелый список заголовка хоста для пересылки на источник даже если конечный результат выполнения лямбда-функции будет состоять в том, чтобы изменить это значение до того, как источник его увидит.

Код на самом деле очень прост - большая часть нижеследующего является пояснительными комментариями.

'use strict';

// if the end of incoming Host header matches this string, 
// strip this part and prepend the remaining characters onto the request path,
// along with a new leading slash (otherwise, the request will be handled
// with an unmodified path, at the root of the bucket)

const remove_suffix = '.example.com';

// provide the correct origin hostname here so that we send the correct 
// Host header to the S3 website endpoint

const origin_hostname = 'example-bucket.s3-website.us-east-2.amazonaws.com'; // see comments, below

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;
    const host_header = headers.host[0].value;

    if(host_header.endsWith(remove_suffix))
    {
        // prepend '/' + the subdomain onto the existing request path ("uri")
        request.uri = '/' + host_header.substring(0,host_header.length - remove_suffix.length) + request.uri;
    }

    // fix the host header so that S3 understands the request
    headers.host[0].value = origin_hostname;

    // return control to CloudFront with the modified request
    return callback(null,request);
};

Обратите внимание, что для индексации документов и перенаправлений из S3 может также потребоваться триггер исходного ответа для нормализацииLocation заголовок против исходного запроса. Это будет зависеть от того, какие именно функции сайта S3 вы используете. Но выше приведенный рабочий пример иллюстрирует общую идею.

Обратите внимание, чтоconst origin_hostname необходимо установить имя хоста конечной точки сегмента, как настроено в исходных настройках CloudFront. В этом примере ведро находится в us-east-2 с активной функцией хостинга веб-сайта.

Спасибо! Но это не сработало без пары изменений. 1. вам нужно добавить в белый списокHost заголовок для передачи исходного хоста входящего запроса, например,host_header (выотправил это здесь изначально!) (Документы AWS). 2.,origin_hostname не должен содержатьs3-website-us-east-1 часть. Изменить это наexample-bucket.s3.amazonaws.com mfink
Спасибо за разъяснениеorigin_hostname, Я предполагаю, что мои настройки источника установлены на s3 Bucket Name Sanss3-website-us-east-1, Мой s3 также настроен как веб-сайт, поэтому это может объяснить, почему мне нужно было указать index.html в качестве моегоDefault Root Object когда не указываете мое происхождение в качестве URL сайта. mfink
@mfink спасибо за отзыв. Я действительно забыл включить упоминание оHost белый список заголовков. Дляorigin_hostnameтем не менее, используя имя хоста конечной точки REST для сегмента (например,example-bucket.s3.amazonaws.com) не будет работать, если включена функция хостинга веб-сайта, и вы используете конечную точку веб-сайта в качестве имени домена-источника, что обычно имеет место в этом приложении, поскольку это необходимо для отображения документов с автоматическим индексированием. Michael - sqlbot
@ mfink да. Корневой объект по умолчанию обрабатывает только фактический путь/, Индексные документы с помощью функции размещения веб-сайтов могут неявно отображать любой файл index.html по любому пути (/foo/bar перенаправляет на/foo/bar/ который неявно оказывает/foo/bar/index.html... но может потребоваться больше Lambda @ Edge в этом контексте, чтобыLocation заголовок правильный). Если ваш контейнер настроен как веб-сайт, вы можете использовать конечную точку веб-сайта в качестве имени домена источника:stackoverflow.com/a/34065543/1695906. Michael - sqlbot
0

Добавить всеAlternate CNAMEs записи в распределении облачного фронта

Добавьте пользовательское происхождение в качестве сервера EC2.

Установите поведение в соответствии с вашими требованиями.

Настройте виртуальные хосты nginx на сервере для маршрутизации в определенные папки.

Похожие вопросы