Где я могу установить информацию о кеше для моих изображений? - PullRequest
1 голос
/ 17 апреля 2019

Это примерно Rails приложение на Heroku, которое работает за CloudFront и обслуживает ActiveStorage изображения из дополнения Bucketeer.

Конфигурация кэша как самого приложения Rails, так и CloudFront точно соответствует цели для css, js и даже ключевых важных запросов (таких как результаты поиска, информация сторонних производителей, полученная из API и т. Д.) .

То, что я не могу понять, как кэшировать, это изображения, полученные из дополнения Bucketeer.

Прямо сейчас изображения, похоже, приходят из ведра Bucketeer каждый раз. Они появляются без кеша TTL.

Я бы хотел, чтобы они кэшировались на срок до года как на уровне CloudFront, так и на уровне браузера посетителя.

Возможно ли это?

Похоже, что надстройка Bucketeer сама по себе не дает нам контроля над тем, как корзина и / или служба обрабатывают кеширование.

Где можно заставить эти файлы отображаться с инструкциями кеширования?

1 Ответ

0 голосов
/ 18 апреля 2019

После долгих поисков я узнал, что Bucketeer дает контроль за ведром. Вам просто нужно использовать AWS CLI.

Вот ссылка на AWS документы на CLI: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html

А вот ссылка, где Bucketeer рассказывает, как начать работу с этим в их сервисе: https://devcenter.heroku.com/articles/bucketeer#using-with-the-aws-cli

Это означает, что вы можете установить AWS CLI, выполнить aws configure с учетными данными, предоставленными Bucketeer, а затем перейти к непосредственному изменению cache-control в корзине.

AWS, похоже, не имеет функции для установки cache-control значений по умолчанию для всей корзины или папки, поэтому вы фактически делаете это для каждого объекта.

В моем случае все мои файлы / объекты в корзине - это изображения, которые я отображаю на веб-сайте и которые необходимо кэшировать, поэтому можно безопасно запускать команду, которая делает все это сразу.

Такая команда может быть найдена в этом ответе: Как установить заголовки expires для всех изображений в корзине в Amazon S3

Для меня это выглядело так: aws s3 cp s3://my-bucket-name s3://my-bucket-name --recursive --acl public-read --metadata-directive REPLACE --cache-control max-age=43200000

Команда в основном копирует весь контейнер на себя, добавляя заголовок cache-control max-age=43200000 к каждому объекту в процессе.

Это работает для всех существующих файлов, но не изменит ничего для будущих изменений или дополнений. Вам придется запускать это снова и снова, чтобы перехватывать новые вещи и / или писать код для установки заголовков ваших объектов при сохранении объекта в корзину. Видимо, есть люди, которым повезло с этим. Не я.

К счастью, я нашел этот пост: https://www.neontsunami.com/posts/caching-variants-with-activestorage

Этот monkey-patch в основном меняет ActiveStorage::RepresentationsController#show на использование Rails кэширования действий для вариантов. Взглянуть. Если у вас есть подобные проблемы, стоит прочитать.

Есть недостатки. В моем случае они не были проблемой, поэтому я решил использовать это решение.

...