我如何排查在 Amazon S3 上托管并通过 CloudFront 提供的静态网站上的延迟?

上次更新时间:2020 年 6 月 29 日

我的网站上的静态内容托管在 Amazon Simple Storage Service (Amazon S3) 存储桶上并通过 Amazon CloudFront 分配向用户提供。我的网站内容加载得很慢,或者我发现到第一个字节的时间 (TTFB) 指标过高。我应该如何排查此问题?

简短描述

要排除您的网站上的静态内容加载延迟的问题,请确定下面哪些事件可导致延迟。然后,实施方法来优化这些事件:

  1. 当客户端发送域名 DNS 查询时(DNS 查找进程)。
  2. 当客户端将请求发送到 Web 服务器(CloudFront 内容交付网络)时,包括 SSL/TLS 协商。
  3. 当 CloudFront 处理该请求并从缓存中提供内容时,或由 CloudFront 将请求转发到源 (Amazon S3) 时。

这些事件的性能取决于:

  • 本地系统上的 Web 浏览器和资源
  • 本地网络
  • 本地 DNS 服务器
  • 本地路由器、防火墙或代理
  • 上游 DNS 服务器
  • 互联网服务提供商
  • Amazon S3 和 CloudFront

解决方法

确定哪些事件可导致延迟

利用 Web 浏览器的开发人员工具检查对您的网站内容的请求中的每个组成部分的性能。例如,如果您使用的是 Mozilla Firefox,请参阅 MDN Web 文档网站上的 Firefox 开发人员工具网络请求详细信息

在您确定了哪些事件导致延迟之后,请审核下列注意事项以减少这些事件所用的时间。

当客户端发送域名 DNS 查询时(DNS 查找进程)

请考虑这些优化 DNS 查找进程的方法:

  • 启用或增加客户端 DNS 缓存。
  • 设置或增加本地 DNS 服务器上的 DNS 缓存。
  • 如果来自互联网服务提供商的解析程序 DNS 服务器导致延迟,则考虑使用公有 DNS 服务器。

当客户端将请求发送到 Web 服务器(CloudFront 内容交付网络)时,包括 SSL/TLS 协商

请考虑以下方法来缩短客户端到服务器的连接时间:

  • 通过改变您 Web 缓存、互联网服务提供商或网络路由,优化您的本地网络性能。您的 Web 浏览器与 CloudFront 之间的连接很大程度上取决于本地网络、来自互联网服务提供商的带宽以及网络路由或离该客户端最近的 CloudFront 节点 (POP) 位置所需的跃点。最佳实践是为 Web 资源配置最优化的路径。此外,您可以使用正确的 DNS 解析程序和 Web 浏览器来查找最近的正确 POP 位置。
  • 使用本地缓存减少从服务器 (CloudFront) 获取资源的请求。本地缓存对于不经常更改的静态对象特别有用,例如 CSS、Javascript 或映像。对于托管在 Amazon S3 上的静态内容,您可以向对象添加缓存控制标头。缓存控制标头指示 Web 浏览器将 Web 内容在浏览器的内存中或本地磁盘中保留一段时间。在此期间,Web 浏览器从本地内存加载这些内容,而不必通过 Internet 请求内容。您可以使用 Amazon S3 控制台设置缓存控制标头
  • 如果您已有本地缓存 HTTP 转发代理,您可以指定足够保存您的网站内容的本地缓存大小。这可以减少通过 Internet 发送的请求数量,因为经常访问的页存储在本地代理缓存中,在请求时由该缓存为浏览器提供这些内容。

当 CloudFront 处理该请求并从缓存中提供内容时,或由 CloudFront 将请求转发到源 (Amazon S3) 时

您可以通过从缓存提供更多内容并减少向源发出的内容请求,来减少加载您的网站时产生的延迟。请考虑通过以下方法优化您的 CloudFront 配置,以使您的 Web 内容主要从缓存中提供:

  • 在 CloudFront 提高静态内容的最小缓存时间。或者,您可以在您的 CloudFront 分配的默认行为中提高最小缓存时间。为了提高您的分发的默认行为中的最小缓存时间可采用的一种方法是增加最小 TTL 值,使 CloudFront 缓存对象更长,而不是从您的 Amazon S3 源请求对象。
  • 审核标头或查询字符串的转发或缓存设置。当缓存基于所选请求标头查询字符串转发和缓存的值都设置为无(增加缓存)时,CloudFront 缓存得到优化。但是,如果您的转发或缓存必须基于其中的一些值,请确保仅转发或缓存特定标头和查询字符串。
    注意:切勿将 CloudFront 配置为将 Cookie 转发到 Amazon S3 源。Amazon S3 不处理 Cookie
  • 在您的 CloudFront 分配上启用压缩。当您启用压缩时,CloudFront 自动压缩位于边缘或 POP 位置的对象,然后提供压缩的对象。这可减少下载时间并提高页面加载性能。
  • 为静态内容使用单独的缓存行为。最佳实践是为静态内容和动态内容使用不同的缓存行为。

按照以下步骤为您的静态内容配置最佳缓存设置:

  1. 打开 CloudFront 控制台
  2. 在分配列表中,选择为您的网站提供静态内容的分配。
  3. 选择行为选项卡。
  4. 您可以为静态内容创建新行为,也可以编辑静态内容路径模式的现有行为。要编辑现有行为,请选择该行为,然后选择编辑
  5. 对于缓存基于所选请求标头,请选择无(增加缓存)以优化缓存。如果您必须转发特定标头,请选择白名单,然后仅添加所需的标头。
  6. 对于对象缓存,要在 Amazon S3 对象上使用缓存控制标头,请选择使用源缓存标头。要覆盖来自 Amazon S3 源的缓存控制标头,选择自定义。然后,将最小 TTL 设置为您希望使用的最小缓存持续时间。
    警告:分配行为的最小 TTL、最大 TTL 和默认 TTL 值与在来自源的对象上设置的缓存标头交互。
  7. 对于转发 Cookie,请选择无(增加缓存)
  8. 对于查询字符串转发和缓存,请选择 无(增加缓存)以优化缓存。如果您必须转发某些查询字符串,请选择转发所有,缓存基于白名单,然后仅添加所需的查询字符串。
  9. 对于自动压缩对象,请选择
  10. 选择是,编辑以保存您的更改。