如何减少由于 CloudFront 缓慢响应造成的延迟?

上次更新时间:2020 年 8 月 28 日

从 Amazon CloudFront 下载对象或映像时,我发现了高延迟。收到“X-Cache:Miss from cloudfront”响应的请求加载速度比收到“X-Cache:Hit from cloudfront”响应的请求要慢。为什么会发生这种情况? 如何修复此问题? 

解决方法

当请求发送到源时,CloudFront 会返回“X-Cache:Miss from cloudfront”。当请求来自最近的边缘站点时,CloudFront 会返回“X-Cache:Hit from cloudfront”。“Miss”请求可能加载得比较慢,因为存在转发到源的额外步骤。

为了避免将请求转发到源产生的延迟,请检查以下各项以确保请求可来自 CloudFront 边缘站点:

  • 请勿转发所有标头、所有 Cookie 或所有查询字符串,因为这样会指引 CloudFront 传递请求而非缓存它们。
  • 验证是否为很少更改的静态内容(如 CSS 文件)和经常更改的动态内容(如 JavaScript 文件)分别设置了单独的缓存行为。对于静态内容,请避免根据 Cookie、查询字符串或标头进行缓存,因为这些内容对于源提供内容是不必要的。
    注意:对于 Web 分配,默认情况下 CloudFront 在缓存边缘站点中的对象时不考虑 cookie。如果您的源返回了两个对象,并且它们只是 Set-Cookie 标头中的值不同,则 CloudFront 仅缓存该对象的一个版本。
  • 在 CloudFront 查询源之前,扩展缓存中需要更多时间的路径模式的最小 TTL、最大 TTL 或默认 TTL。
  • 如果您的源使用 Cache-Control 标头,请验证指令符合分配中的最小 TTL、最大 TTL 或默认 TTL 集。
  • 如果您的源使用 Expires 标头,请验证标头允许 CloudFront 根据需要缓存响应。
  • 验证您的源服务器设置了有效、准确的 Date 和 Last-Modified 标头字段值。
  • 限制使用对象失效。仅在必要时运行失效。
  • 检查请求对象的频率。如果不经常请求对象,CloudFront 可能会从边缘站点删除该对象。

如果您提供的是动态内容,并且期望您的请求获得“X-Cache:Miss from cloudfront”响应,请考虑在不使用缓存的情况下采用以下方法来减少这些请求的延迟:

  • 设置更多在地理位置上与请求者更接近的源服务器。然后,设置一个基于延迟的路由 DNS 记录(例如,origin-latencybased-dnsrecord.example.com)来解析为这些服务器。在 CloudFront 中,将 DNS 名称(例如,origin-latencybased-dnsrecord.example.com)配置为分配的源。此配置允许 CloudFront 根据请求所在的边缘站点以最低延迟从源服务器获取内容。如果您使用 Amazon Route 53 作为 DNS 提供商,请参阅在 Amazon Route 53 中向基于延迟的路由添加其他区域。
  • 增加 CloudFront 源的保持活动空闲超时时间。此值指定了在关闭连接前 CloudFront 与源服务器保持空闲连接的时长。默认的保持活动空闲超时时间为 5 秒,但如果源服务器支持,则可以设置更高的值(最长 60 秒)。如果您的分配将动态内容请求转发到源,那么增加超时值有助于减少延迟,因为 CloudFront 不必为每个请求创建新的连接。
    注意:一个源可以分配有多个 IP 地址。要跨多个源 IP 地址使用持久连接,CloudFront 依赖于更高的请求速率和更高的请求频率。这是因为请求通过源 IP 地址进行循环路由,并且每个 IP 地址都是持久连接。