В вашем вопросе об этом не говорится, но CDN, например AWS CloudFront, часто используется с приложением Rails. Вы, вероятно, захотите сэкономить вычислительную мощность, особенно на Heroku.
Вот что происходит в этом сценарии. Вы визуализируете страницу как обычно, и все изображения запрашиваются с узла ресурсов, которым является CDN, потому что именно так он настроен для интеграции. Его настройка для извлечения всего, что не находит в кеше, из источника, который снова является вашим приложением.
Сначала проходят все запросы изображений. Контроллер ActiveStorage создает для них подписанные URL-адреса, а CDN передает их, но также кэширует.
Теперь возникает проблема. Подписанный URL-адрес по умолчанию истекает через 5 минут, но CDN кэширует обычно намного дольше. Это связано с тем, что обычно вы используете дайджест-активы, то есть они становятся недействительными не по времени, а по имени, при любом изменении.
Решение простое. Увеличьте срок действия подписанного URL-адреса, чтобы он превышал TTL кеша. Теперь кеш удаляет кэшированный подписанный URL-адрес, прежде чем он станет недействительным.
Установите срок действия URL-адреса с помощью ActiveStorage::Service.url_expires_in
в 5.2 или непосредственно в Rails.application.config.active_storage.service_urls_expire_in
в инициализаторе подробности см. в этом ответе.
Чтобы установить TTL кеша в CloudFront: откройте консоль AWS, выберите распределение, откройте вкладку Поведение, прокрутите вниз до следующих полей:
Затем, при желании, сделайте аннулирование, чтобы принудительно повторно кэшировать все содержимое.
Имейте в виду, что существует компромисс безопасности. Если содержимое изображения является частным, то, скорее всего, оно не принадлежит CDN и не должно иметь длительных временных URL-адресов. В этом случае выберите решение, которое полностью исключает вложения из CDN. Ваше приложение должно будет справиться с дополнительной нагрузкой, связанной с подписанием URL-адресов всех прикрепленных ресурсов поверх рендеринга соответствующей страницы.
Кроме того, имейте в виду, что это не обязательно хорошее решение, это скорее обходной путь. С помощью описанной выше настройки вы будете кэшировать перенаправления, и более тяжелые запросы будут напрямую попадать в вашу корзину хранилища. Обычный сценарий для CDN - это большие носители, а не легкие перенаправления. Тем не менее, вы избавляете приложение от обработки большого количества запросов. Следует выяснить, насколько это допустимая оптимизация.
person
febeling
schedule
21.02.2020