Cloudfront TTL не работает

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

Для создания эскизов я настроил следующую схему: Учетная запись S3 для исходных изображений Сервер Ubuntu с использованием NGINX и Thumbor Cloudfront

Пользователь загружает в S3 исходные образы, которые будут подтягиваться через Ubuntu Server с Cloudfront перед запросом:

http://cloudfront.account/thumbor-server/http://s3.aws ...

Дело в том, что мы часто теряем объекты в Cloudfront, я хочу, чтобы они оставались в кеше 360 дней. Я получаю следующий ответ через URL-адрес Cloudfront:

Cache-Control:max-age=31536000
Connection:keep-alive
Content-Length:4362
Content-Type:image/jpeg
Date:Sun, 26 Oct 2014 09:18:31 GMT
ETag:"cc095261a9340535996fad26a9a882e9fdfc6b47"
Expires:Mon, 26 Oct 2015 09:18:31 GMT
Server:nginx/1.4.6 (Ubuntu)
Via:1.1 5e0a3a528dab62c5edfcdd8b8e4af060.cloudfront.net (CloudFront)
X-Amz-Cf-Id:B43x2w80SzQqvH-pDmLAmCZl2CY1AjBtHLjN4kG0_XmEIPk4AdiIOw==
X-Cache:Miss from cloudfront

После нового обновления я получаю:

Age:50
Cache-Control:max-age=31536000
Connection:keep-alive
Date:Sun, 26 Oct 2014 09:19:21 GMT
ETag:"cc095261a9340535996fad26a9a882e9fdfc6b47"
Expires:Mon, 26 Oct 2015 09:18:31 GMT
Server:nginx/1.4.6 (Ubuntu)
Via:1.1 5e0a3a528dab62c5edfcdd8b8e4af060.cloudfront.net (CloudFront)
X-Amz-Cf-Id:slWyJ95Cw2F5LQr7hQFhgonG6oEsu4jdIo1KBkTjM5fitj-4kCtL3w==
X-Cache:Hit from cloudfront

Мои ответы Nginx следующие:

Cache-Control:max-age=31536000
Content-Length:4362
Content-Type:image/jpeg
Date:Sun, 26 Oct 2014 09:18:11 GMT
Etag:"cc095261a9340535996fad26a9a882e9fdfc6b47"
Expires:Mon, 26 Oct 2015 09:18:11 GMT
Server:nginx/1.4.6 (Ubuntu)

Почему Cloudfront не сохраняет мои объекты, как указано? Максимальный возраст установлен? Спасибо заранее.


person sullivan    schedule 29.10.2014    source источник
comment
Возможно, вы не попадаете в одно и то же местоположение Cloudfront. Каждое местоположение будет кэшировать файлы индивидуально, пока во всех местоположениях не будет файла, который вы хотите кэшировать, он все равно может получить его из источника.   -  person datasage    schedule 29.10.2014
comment
Я пробовал несколько раз и даже создал маленькое java-приложение - и мне кажется, что кэш сбрасывается. Через некоторое время я настроил максимальный возраст, но я думаю, что он будет переопределен для существующих элементов?   -  person sullivan    schedule 29.10.2014


Ответы (1)


Ваш второй запрос показывает, что объект действительно был кэширован. Я предполагаю, что вы это видите, но вопрос не проясняет.

Cache-Control: max-age указывает только максимальный возраст ваших объектов в Cloudfront Cache в любом конкретном пограничном расположении. Не существует минимального интервала времени, в течение которого ваши объекты гарантированно сохраняются... в конце концов, Cloudfront — это кэш, который по определению нестабилен.

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

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html

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

Если вы пытаетесь распределить нагрузку на свой внутренний сервер, может иметь смысл разместить перед ним какой-то кеш, который вы контролируете, например, лак, кальмар, другой nginx или специальное решение, как я Добиваюсь этого в своих системах.

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


Тогда почему существует задокументированный минимальный TTL?

На той же странице, указанной выше, вы также найдете это:

Если вы добавляете к своим объектам заголовки Cache-Control или Expires для веб-распространений, вы также можете указать минимальное количество времени, в течение которого CloudFront хранит объект в кеше, прежде чем перенаправить другой запрос в источник.

Я понимаю, почему это, и подсказка, приведенная в комментарии ниже...

Минимальное время (в секундах), в течение которого объект находится в кэше CloudFront, прежде чем CloudFront перенаправит другой запрос в ваш источник, чтобы определить, доступна ли обновленная версия.

... казалось бы, противоречит моему ответу. Однако противоречия нет.

Проще говоря, минимальный ttl устанавливает нижнюю границу для внутренней интерпретации Cache-Control: max-age, переопределяя — внутри Cloudfront — любое меньшее значение, отправленное исходным сервером. Сервер говорит, что кеширует его на 1 день, максимум, но настроенный минимальный ttl составляет 2 дня? Cloudfront забывает о том, что он видел в заголовке max-age, и может не проверять источник снова при последующих запросах в течение следующих 2 дней, а не проверять снова через 1 день.

Природа кеша диктует правильную интерпретацию всей очевидной двусмысленности:

Ваша конфигурация ограничивает время, в течение которого Cloudfront МОЖЕТ обслуживать кэшированные копии объекта, и точку, после которой он НЕ ДОЛЖЕН продолжать возвращать объект из своего кеша. Они не определяют, как долго Cloudfront ДОЛЖЕН поддерживать кэшированную копию, потому что Cloudfront МОЖЕТ вытеснить объект в любое время.

Если вы правильно установите заголовок Cache-Control:, Cloudfront будет рассматривать большее из max-age или вашего минимального TTL как максимальное время, в течение которого вы хотите, чтобы они обслуживали кешированную копию без повторных консультаций с исходным сервером.

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

person Michael - sqlbot    schedule 29.10.2014
comment
Спасибо за хороший отзыв. Я установил для параметра Min TTL значение 31536000 в консоли администратора, что, по крайней мере, насколько я понимаю, означает следующее: минимальное количество времени (в секундах), в течение которого объект находится в кэше CloudFront, прежде чем CloudFront перенаправит другой запрос в ваш источник для определить, доступна ли обновленная версия. Время по умолчанию — 24 часа. Чтобы изменить время, в течение которого объект находится в кэше, настройте источник, чтобы добавить директиву Cache-Control max-age. См. справку. - person sullivan; 30.10.2014
comment
Я понимаю, почему это, кажется, говорит нечто иное, чем то, что на самом деле означает. Обновленный ответ. - person Michael - sqlbot; 30.10.2014
comment
Поэтому ваш совет — использовать NginxCache или Varnish вместо CDN. Насколько я понял ваш обновленный пост, невозможно заставить CloudFront хранить его в течение x секунд. - person sullivan; 30.10.2014
comment
Нет, не вместо. В дополнение к. Cloudfront очень полезен и быстр, но если вы хотите, чтобы ваш сервер изменения размера отображал как можно меньше запросов, вам может понадобиться кеш между облачным фронтом и средством изменения размера. Я разработал продукт/услугу, которая использует S3 в качестве кэша бесконечного размера. Облачный фронт бьет меня, я проверяю S3 и возвращаю результат, если он найден, в противном случае я отправляю запрос на серверную часть, возвращаю ответ запрашивающему, а затем сохраняю копию в S3 для будущих запросов. - person Michael - sqlbot; 30.10.2014
comment
@Michael-sqlbot, где мы можем найти информацию об этом сервисе? В вашем профиле нет ссылки, и при поиске в Google кажется, что «sqlbot» является вашим предпочтительным именем в Интернете, а не компанией. - person Jos; 03.11.2014
comment
Спасибо Михаил за помощь. Я разработал приложение Groovy&Grails с удобной службой изменения размера, резервным копированием S3 и CDN впереди. Но было бы полезно услышать, как вы добились своего. - person sullivan; 03.11.2014