增加直接从 CloudFront 缓存提供服务的请求的比例(缓存命中率) - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

增加直接从 CloudFront 缓存提供服务的请求的比例(缓存命中率)

您可以通过增加直接从 CloudFront 缓存提供服务的查看器请求的比例(而不是转至源服务器以获得内容)来提高性能。这称为提高缓存命中率。

以下部分说明了如何提高缓存命中率。

指定 CloudFront 缓存对象的时间长度

要提升缓存命中率,您可以配置源来将 Cache-Control max-age 指令添加到您的对象,并为 max-age 指定在实践中可行的最长值。缓存持续时间越短,CloudFront 将请求发送到源(用以确定对象是否已更改,并获取最新版本)的次数就越多。您可以用 stale-while-revalidatestale-if-error 指令来补充 max-age,以进一步提高某些条件下的缓存命中率。有关更多信息,请参阅管理内容保留在缓存中的时间长度(过期)

使用 Origin Shield

Origin Shield 可以帮助提高 CloudFront 分配的缓存命中率,因为它在源之前提供了额外的缓存层。当您使用 Origin Shield 时,从所有 CloudFront 缓存层到您的源的所有请求都来自一个位置。CloudFront 可以使用来自 Origin Shield 的单个源请求检索每个对象,CloudFront 缓存的所有其他层(边缘站点和区域边缘缓存)可以从 Origin Shield 中检索对象。

有关更多信息,请参阅使用 Amazon CloudFront Origin Shield

根据查询字符串参数进行缓存

如果您将 CloudFront 配置为基于查询字符串参数进行缓存,则可以通过以下方法来改进缓存:

  • 将 CloudFront 配置为仅转发您的源将返回唯一对象的那些查询字符串参数。

  • 为相同参数的所有实例使用相同的大小写。例如,如果一个请求包含 parameter1=A,另一个请求包含 parameter1=a,则 CloudFront 在一个请求包含 parameter1=A 而一个请求包含 parameter1=a 时,会将两个请求分别转发到源。然后,CloudFront 分别缓存源返回的对应对象,即使这些对象完全相同。如果您仅使用 Aa,CloudFront 会将较少的请求转发到源。

  • 按相同的顺序列出参数。与大小写不同的情况相似,如果对象的一个请求包含查询字符串 parameter1=a&parameter2=b,而相同对象的另一个请求包含 parameter2=b&parameter1=a,CloudFront 会将两个请求转发到源,并分别缓存对应的对象,即使它们完全相同。如果您始终为参数使用相同的顺序,CloudFront 会将较少的请求转发到源。

有关更多信息,请参阅根据查询字符串参数缓存内容。如果您希望查看 CloudFront 转发到源的查询字符串,请查看 CloudFront 日志文件的 cs-uri-query 列中的值。有关更多信息,请参阅配置和使用标准日志(访问日志)

根据 Cookie 值进行缓存

如果您将 CloudFront 配置为基于 Cookie 值进行缓存,则可以通过以下方法来改进缓存:

  • 将 CloudFront 配置为仅转发指定的 Cookie 而不是转发所有 Cookie。对于配置为由 CloudFront 转发到源的 Cookie,CloudFront 将转发每个 Cookie 名称和值组合。然后,它单独缓存由源返回的对象,即使这些对象全都相同。

    例如,假设查看器在每个请求中包含两个 Cookie,每个 Cookie 有三个可能的值,并且 Cookie 值的所有组合均可能。CloudFront 最多会为每个对象将六个不同的请求转发到您的源。如果您的源仅基于其中一个 Cookie 返回不同的对象版本,则 CloudFront 会不必要地将更多请求转发到您的源,并且不必要地缓存对象的多个相同版本。

  • 为静态和动态内容创建单独的缓存行为,将 CloudFront 配置成仅为动态内容将 Cookie 转发到源。

    举例而言,假设您的分配只有一个缓存行为,而您希望将分配同时用于动态内容(例如 .js 文件)和很少更改的 .css 文件。CloudFront 根据 Cookie 值缓存 .css 文件的单独版本,这样每个 CloudFront 边缘站点会为每个新 Cookie 值或 Cookie 值的组合将请求转发到您的源。

    如果您创建一个缓存行为,其路径模式为 *.css 并且 CloudFront 不根据 Cookie 值进行缓存,则 CloudFront 仅在以下情况下将 .css 文件的请求转发到源:边缘站点收到给定 .css 文件的第一个请求以及 .css 文件过期后收到的第一个请求。

  • 如果可能,请在 Cookie 值对于每个用户唯一(例如用户 ID)时为动态内容创建单独的缓存行为,并为基于少量唯一值变化的动态内容创建单独的缓存行为。

有关更多信息,请参阅根据 Cookie 缓存内容。如果要查看 CloudFront 转发到源的 Cookie,请查看 CloudFront 日志文件的 cs(Cookie) 列中的值。有关更多信息,请参阅配置和使用标准日志(访问日志)

根据请求标头进行缓存

如果您将 CloudFront 配置为基于请求标头进行缓存,则可以通过以下方法来改进缓存:

  • 将 CloudFront 配置为仅基于指定标头进行转发和缓存,而不是基于所有标头转发和缓存。对于您指定的标头,CloudFront 将转发每个标头名称和值组合。然后,它单独缓存由源返回的对象,即使这些对象全都相同。

    注意

    CloudFront 始终将以下主题中指定的标头转发给您的源:

    当您将 CloudFront 配置为基于请求标头进行缓存时,无需更改 CloudFront 转发的标头,仅更改 CloudFront 是否基于标头值缓存对象。

  • 尝试避免基于具有大量唯一值的请求标头进行缓存。

    例如,如果您希望基于用户设备提供不同大小的图像,不要将 CloudFront 配置为基于 User-Agent 标头进行缓存,这会导致大量可能的值。而应该将 CloudFront 配置为基于 CloudFront device-type 标头 CloudFront-Is-Desktop-ViewerCloudFront-Is-Mobile-ViewerCloudFront-Is-SmartTV-ViewerCloudFront-Is-Tablet-Viewer 进行缓存。此外,如果您为平板电脑和桌面返回相同版本的图像,则仅转发 CloudFront-Is-Tablet-Viewer 标头,而不是 CloudFront-Is-Desktop-Viewer 标头。

有关更多信息,请参阅根据请求标头缓存内容

不需要压缩时删除 Accept-Encoding 标头

如果未启用压缩 – 由于源不支持它,CloudFront 不支持它,或者内容不可压缩 – 您可以通过将分配中的缓存行为与设置 Custom Origin Header 的源相关联来增加缓存命中率,如下所示:

  • 标头名称Accept-Encoding

  • Header value (标头值):(保留为空)

在使用此配置时,CloudFront 会从缓存键中删除 Accept-Encoding 标头,并且不在源请求中包含标头。此配置应用于 CloudFront 从该源通过分发所提供的所有内容。

使用 HTTP 提供媒体内容

有关优化点播视频 (VOD) 和流式传输视频内容的信息,请参阅使用 CloudFront 的点播视频和实时流视频