Minimum TTL
редко нуждается в настройке.
Minimum TTL
действительно не определяет минимальное время, в течение которого CloudFront будет кэшировать объект. Вот как это звучит, но это распространенное заблуждение.
Чтобы прояснить этот момент, позвольте мне сначала уточнить TTL.
TTL (время жизни) - это значение, которое CloudFront вычисляет внутри каждого отдельного объекта, чтобы определить, следует ли вообще кэшировать объект, а затем определить, находится ли еще объект, найденный в кэше. считается свежим . Если объект находился в кэше меньше времени, чем его TTL, он называется свежим , в противном случае он называется устаревшим .
A свежий объект может быть предоставлен зрителю без проверки его происхождения.
A устаревший объект должен не быть предоставлен зрителю без проверки источника и в конечном итоге должен быть очищен.
CloudFront может сохранять устаревший объект в своем кеше в течение некоторого периода времени. (Он может проверить с помощью источника, является ли устаревший объект по-прежнему исправным, с помощью условного запроса. Он также может продолжать использовать устаревший объект в ограниченных условиях, включая перебои в работе вашего источника).
CloudFront также может удалить свежий объект из своего кэша в любое время. Зачем это делать? Кэш-память свободна, поэтому не имеет смысла, чтобы все, что кэширует CloudFront, продолжало храниться в кеше, если его не запрашивают. CloudFront может в любое время удалить «непопулярный» объект из кэша.
Из этого, мы надеемся, ясно, что TTL не "как долго CloudFront будет кешировать объект?" , а скорее "как долго CloudFront будет считать кэшированный объект свежий? "
Если вычисленный TTL объекта равен 0, CloudFront не будет кэшировать объект.
Итак ... как бы объект получил вычисленный 0 TTL? По крайней мере один из этих заголовков в ответе от источника:
Cache-Control: private
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: s-maxage=0
Cache-Control: max-age=0 // ignored when s-maxage is present
Это единственные случаи, когда Minimum TTL
обычно играет определенную роль. (Кроме того, HTTP-заголовок Expires
может инициировать его, но не используйте Expires
- используйте Cache-Control
).
Cache-Control
- как возвращено исходным сервером - в первую очередь предназначено для браузера, но CloudFront также наблюдает его при попытке вычислить соответствующий TTL для каждого объекта.
Minimum TTL
устанавливает нижнюю границу значения CloudFront будет экстраполироваться из заголовка Cache-Control
источника, из вышеприведенных условий, а меньшие значения округляются в большую сторону. Если ваш источник возвращает (например,) Cache-Control: private, no-cache, no-store
, это TTL, который должен быть 0 ... но CloudFront устанавливает свой внутренний TTL для этого объекта на , большее 0 или Minimum TTL
.
Если бы ответ имел (например) Cache-Control: max-age=15
, то и браузеры, и CloudFront вычислили бы TTL для этого объекта за 15 секунд. Если (например) Minimum TTL
установлено на 300, то CloudFront игнорирует 15 секунд, указанных источником, и устанавливает свой внутренний TTL для объекта на 300 секунд. Браузер по-прежнему будет использовать 15 секунд, поскольку CloudFront не изменяет заголовок ответа Cache-Control
.
tl; dr: Minimum TTL
- это минимальное внутреннее значение TTL, которое CloudFront будет назначать объекту, независимо от значений в исходном ответе, которые должны побудить его вычислить меньшее значение. Изменение этого параметра со значения по умолчанию 0 является дополнительным параметром. Он не устанавливает минимальное время, необходимое CloudFront для кэширования объектов.
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html#ExpirationDownloadDist