跳至内容

当我设置自定义对象缓存时,为什么我的 CloudFront 分配使用我的来源的缓存设置?

2 分钟阅读
0

我想解决为什么我的 Amazon CloudFront 分配在我设置自定义对象缓存时使用我的来源的缓存设置。

简短描述

自定义对象缓存时,需要配置默认生存时间(默认 TTL)、最小 TTL 和最大 TTL

CloudFront 使用以下行为:

  • 如果来源未返回缓存标头,则 CloudFront 分配使用默认 TTL
  • 如果来源返回的缓存标头小于最小 TTL,则分配使用最小 TTL
  • 如果来源返回的缓存标头大于最大 TTL,则分配使用最大 TTL

注意:对客户端的响应包含来源的缓存标头,即使 CloudFront 根据最小 TTL最大 TTL 缓存响应也是如此。所有私有缓存(例如浏览器或代理)都可以使用来源的缓存标头。

如果您的分配未根据您的默认 TTL 值进行缓存,请验证来源的缓存标头是否不存在冲突。

解决方法

识别冲突的缓存标头

验证来源的缓存标头是否与您的分配的自定义对象缓存冲突。

最小 TTL 和默认 TTL 设置为 0,但仍有来自 CloudFront 的缓存结果

检查 CloudFront 的响应,验证 X-Cache 的值是 Hit from cloudfront 还是 RefreshHit from cloudfront

< HTTP/1.1 200 OK
< Content-Type: text/html
< Content-Length: 437
< Connection: keep-alive
< Date: Sat, 03 Feb 2018 19:26:45 GMT
< Last-Modified: Sat, 03 Feb 2018 19:25:24 GMT
< ETag: "example12345abcdefghijklmno54321"
< Cache-Control: max-age=300, Public
< Accept-Ranges: bytes
< Server: AmazonS3
< Age: 14
< X-Cache: Hit from cloudfront

如果 X-CacheHit from cloudfrontRefreshHit from cloudfront,则请求来自边缘站点的缓存。在一次刷新中,CloudFront 会向来源重新验证过期对象未被修改,然后在该对象过时时刷新。

检查响应中的 Cache-ControlExpiresAge 值。如果 Cache-Controlmax-age 值大于 Age 的值,则缓存的响应来自 CloudFront 缓存。如果 Expires 日期仍在将来,则缓存的响应也不会过时。即使缓存行为路径将最小 TTL默认 TTL 设置为 0,这也是预期的行为。

**注意:**在前面的示例中,最大 TTL 大于 0。当所有 TTL 值都设置为 0 时,缓存处于关闭状态。

最大 TTL 和默认 TTL 大于 0,但有 CloudFront 遗漏

检查 CloudFront 的响应,以验证 X-Cache 的值是否为 Miss from cloudfront

< HTTP/1.1 200 OK
< Content-Type: text/html
< Content-Length: 437
< Connection: keep-alive
< Date: Sat, 03 Feb 2018 19:26:45 GMT
< Last-Modified: Sat, 03 Feb 2018 19:25:24 GMT
< ETag: "example12345abcdefghijklmno54321"
< Cache-Control: no-cache, no-store
< Accept-Ranges: bytes
< Server: AmazonS3
< X-Cache: Miss from cloudfront

如果 X-CacheMiss from cloudfront,则请求来自来源而不是缓存。

如果 Cache-Control 值为 no-store,则标头会指示 CloudFront 不缓存响应。如果 Cache-Controlno-cache,则标头会指示 CloudFront 在返回缓存响应之前向来源进行验证。如果 Cache-Controlprivate,则 CloudFront 应仅将响应存储在私有缓存中,例如浏览器的本地缓存。

这些行为会覆盖最大 TTL默认 TTL 设置。

**注意:**不是来自缓存的响应没有 Age 标头。

在前面的示例中,最小 TTL 设置为 0。如果最小 TTL 大于 0,则 CloudFront 会缓存对象,即使响应有 no-cacheno-storeprivate 指令。有关详细信息,请参阅 Specify the amount of time that CloudFront caches objects(指定 CloudFront 缓存对象的时间量)

CloudFront 缓存错误响应

默认情况下,CloudFront 会将来自来源的错误响应转发到客户端,并将来源的错误响应缓存 10 秒。

如果来源的错误响应包含 Cache-Control 标头,则 CloudFront 使用相关的 TTL 缓存错误,而不是默认的 10 秒。

要检查错误响应是来自来源还是 CloudFront,请查看 Server 值。要检查错误是否为缓存响应,请查看响应中是否包含 Age 标头。

以下示例是来自缓存响应 Amazon Simple Storage Service (Amazon S3) 来源的错误:

< HTTP/1.1 403 Forbidden
< Content-Type: application/xml
< Transfer-Encoding: chunked
< Connection: keep-alive
< Date: Sat, 03 Feb 2018 21:07:51 GMT
< Server: AmazonS3
< Age: 12
< X-Cache: Error from cloudfront

以下示例是来自非缓存响应 CloudFront 的错误:

< HTTP/1.1 403 Forbidden
< Server: CloudFront
< Date: Sat, 03 Feb 2018 21:14:53 GMT
< Content-Type: text/xml
< Content-Length: 146
< Connection: keep-alive
< X-Cache: Error from cloudfront

更新来源

确定覆盖您的分配自定义对象缓存的缓存标头后,更新来源。

完成以下步骤:

  1. 确定标头在 Web 服务器配置中的位置。
  2. 移除应用标头的行。
  3. 重启服务器。
  4. 测试您的来源以检查响应中是否不再返回缓存标头。
  5. 对整个 CloudFront 分配进行失效处理以应用更改。

相关信息

根据请求标头缓存内容

管理内容保留在缓存中的时间长度(过期)

AWS 官方已更新 7 个月前