什么是 Cloudfront 最小 TTL?

San*_*Kim 6 amazon-web-services amazon-cloudfront

我试图理解Minimum TTLMaximum TTLDefault TTL用这个文件

据我了解,Maximum TTLHTTP cache header出现在响应中时使用以限制最大缓存时间,并 Default TTL在没有HTTP cache header用作默认缓存时间时使用。

但是,对于Maximum TTL,没有具体提及。

另外,它提到了与转发头的关系。这是否意味着如果我将任何 HTTP 标头设置为转发到源并且Minimum TTL不为 0,则它不会缓存任何内容?

最小 TTL 指定在 CloudFront 将另一个请求转发到源以确定对象是否已更新之前,您希望对象在 CloudFront 缓存中停留的最短时间(以秒为单位)。最小 TTL 的默认值为 0 秒。

重要的

. 如果您将 CloudFront 配置为将所有标头转发到您的源以进行缓存行为,则 CloudFront 永远不会缓存关联的对象。相反,CloudFront 将对这些对象的所有请求转发到源。在该配置中,最小 TTL 的值必须为 0。

Mic*_*bot 22

在决定是否缓存对象以及缓存多长时间时,CloudFront 使用以下逻辑:

检查Cache-Control具有以下值的任何响应标头:

  • no-cache
  • no-store
  • private

如果遇到其中任何一个,请停止并将对象的 TTL¹ 设置为配置的Minimum TTL值。非零值意味着 CloudFront 将缓存它不会缓存的对象。

否则,查找对象可以缓存多长时间的源指令。按顺序,找到以下响应标头之一:

  • Cache-Control: s-maxage=x
  • Cache-Control: max-age=x
  • Expires

停止使用此排序遇到的第一个值,然后继续下一步。

如果未找到值,请使用Default TTL。停止。

否则,使用在上一步中发现的值:

  • 如果小于Minimum TTL,则将对象的 TTL 设置为 Minimum TTL;除此以外,
  • 如果大于Maximum TTL,则将对象的 TTL 设置为 Maximum TTL;除此以外,
  • 使用在上一步中找到的值作为对象的 TTL。

请参阅https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html

请务必注意,TTL 确定允许CloudFront缓存响应的时间。它没有规定 CloudFront需要多长时间来缓存响应。如果对象很少被访问,CloudFront 可以在 TTL 到期之前从缓存中驱逐对象。

一些(但不是全部)标题列入白名单以转发到源不会改变上述任何逻辑。

它改变的是如何评估对象以确定缓存的响应是否可用。

例如,如果您将Origin标头转发到源,则标头的每个唯一值Origin都会创建一个不同的缓存条目。两个相同的请求,除了它们的Origin标头,然后被认为是不同的对象......所以Origin: https://one.example.com如果以后包含对相同资源的请求,则不会使用缓存的响应Origin: https://two.example.com。两者都将被发送到源,并且都将被独立缓存,以用于服务具有相同匹配请求标头的未来请求。

CloudFront 这样做是因为如果您需要将标头转发到源,那么这意味着源可能会对列入白名单的标头的不同值做出不同的反应......因此它们被单独缓存。

不必要地转发标头将因此不必要地降低您的缓存命中率。

根据不同的标头,CloudFront 可以缓存的同一资源的不同副本的数量没有记录限制。

但是将所有标头转发到源将任何未来请求真正相同的可能性几乎为零。这可能会消耗大量缓存存储,存储永远不会再次重用的对象,因此 CloudFront 将此视为一种特殊情况,并且不允许在这种情况下进行任何缓存。因此,您需要将最小 TTL 设置为 0 以保持一致性。


¹此处使用的对象的 TTL是指 CloudFront 的每个缓存对象的内部计时器,该计时器跟踪允许继续为缓存对象提供服务的时间,而无需向源进行检查。CloudFront 中对象的 TTL 只有 CloudFront 知道,因此该值不会影响浏览器缓存。