对 cloudFront 中的最小、最大和默认 TTL 感到困惑

Posted

技术标签:

【中文标题】对 cloudFront 中的最小、最大和默认 TTL 感到困惑【英文标题】:Confused with minimum, maximum and default TTL in cloudFront 【发布时间】:2017-09-06 17:06:19 【问题描述】:

我在 S3 中有我的 Web 应用程序,并使用 cloudFront 的 Web 分发为该应用程序提供服务。我阅读了official documentation,但对很多术语感到困惑。

我的问题:

    我想将 CloudFront 缓存设置为最长 1 年(365 天)。为此,我该怎么做? (我们是否必须为 S3 中的每个对象设置一个标头?)

我遇到了cache-control这个header,发现如果cloudFront返回这样一个带有值的header,那么有缓存功能的浏览器就会缓存给定值的对象。 p>

    如何在cloudFront中设置cache-control header,使对象缓存在用户浏览器中?

    是否有任何工具可以检查 S3 和 cloudFront 部署,即返回的标头?

因此,关于缓存标头的调试将很容易。

@Udo 回答后更新。这是我的请求和响应标头的屏幕截图。

【问题讨论】:

【参考方案1】:

CloudFront 不添加 Cache-Control 标头。如果源服务器提供它,它会将其传递给浏览器。

如果您在将对象上传到 S3 时没有设置 Cache-Control 标头,那么您需要再次上传您的对象或进入 S3 控制台并将标头添加到对象,值为 @987654323 @ 如果您希望 浏览器 将对象缓存长达一年。

如果您将 CloudFront 配置为“使用原始缓存标头”,则 CloudFront 将使用来自 Cache-Control 的 max-age 值来确定对象可以在 CloudFront 缓存多长时间,除非 s-maxage 值也存在,在这种情况下,CloudFront 将使用它。

如果您配置最小/最大/默认值,CloudFront 将使用这些计数器来确定对象可以缓存多长时间:

minimum:即使Cache-Control: max-age(或s-maxage,如果存在)具有较低的值,对象也可以缓存至少这么长时间。事实上,将 Minimum TTL 设置为非零值会导致 CloudFront 忽略 Cache-Control 指令 no-cacheno-storeprivate,并将它们缓存到值 Minimum TTL - 在您想要的情况下很有用浏览器查看这些值,但您仍希望 CloudFront 缓存对象。 最大值:即使Cache-Control: max-age 具有更高的值,对象的缓存时间也不会超过此值。 默认值:如果在对象上看不到Cache-Control,则对象可能会被缓存这么长时间。你不应该需要这个,因为你应该有Cache-Control标题无处不在

关于这些设置的重要注意事项:

它们只影响 CloudFront 缓存,而不影响浏览器缓存。 一旦对象被 CloudFront 缓存,它就无法知道该对象已在 S3 中更改。在计时器到期之前,它可能不会再次检查。 尝试通过在 CloudFront 中设置过长的时间(例如一年)来“强制”CloudFront 在缓存中长时间保留对象没有什么意义,因为 CloudFront 可以随时从其缓存中清除任何对象出于任何原因 - 缓存本质上是易失的。对象的流行度(或不流行度)可能会触发 CloudFront 在计时器到期之前清除它。在下一个请求中,它将由 CloudFront 从源中获取。

同样重要的是,CloudFront 有两个按地理位置组织的缓存层——区域(内部)和边缘(外部)。边缘缓存数量更多且地理分布更广,但区域缓存具有更大的存储容量。如果您通过 CloudFront 获取对象,CloudFront 将缓存该对象某处(在一个区域缓存或一个边缘缓存或每个缓存中),但下一个请求 - 可能来自浏览器不同的地理区域——可能会经过一个边缘和一个区域,该对象以前从未被请求过。另一方面,它可能是通过没有它的边缘请求的,但它会从区域缓存中获取。尝试记住这一点,因为您了解 任何给定对象在任何给定时间都不能正确地说是在缓存中或不在缓存中是什么意思,因为没有“ “缓存。世界上有多个缓存,其中许多不相互通信,因为这会使事情变得更慢,而不是更快。如果您的网站在澳大利亚很受欢迎但在英国不受欢迎,则您的对象的副本可能会缓存在亚太地区的缓存位置,而不是西欧的缓存位置。此行为是自动的,不是您配置的,但您需要注意 CloudFront 没有单一的整体缓存。对象被缓存在它们被访问的地方。

是否有任何工具可以检查 S3 和 cloudFront 部署,即返回的标头

你的眼球是最好的工具。浏览器中的响应标头告诉您需要了解的内容:

Age: 是多久前(以秒为单位)CloudFront 在其缓存中拥有此对象。

X-Cache: Hit from cloudfront 表示 CloudFront 不必从 S3 获取对象,因为它已被缓存。 Miss from cloudfront 表示 CloudFront 在处理此请求的边缘的缓存中没有对象,需要从 S3 获取它。

命令行实用程序curl 及其-v 选项也可用于观察Web 标头。

【讨论】:

嗨迈克尔,你的意思是当 CloudFront 有对象时从 CloudFront 命中? @A.Gao 编辑。我对 Miss 和 Hit 的描述基本上是一样的,这当然是不正确的。我已经编辑了答案,并对造成的混乱表示歉意。这能回答你的问题吗?

以上是关于对 cloudFront 中的最小、最大和默认 TTL 感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

CloudFront 缓存持续时间和最小 TTL

对 CloudFront 分配中的不同域使用不同的 SSL 证书?

最小割最大流定理

C语言 利用指针实现求数组元素中的最大值和最小值

s3 原始存储桶的子目录中的 Cloudfront 默认根对象

网络流最大流最小割定理