增加直接从 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 可以帮助提高 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

  • 标头值:(保留为空)

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

通过 HTTP 提供媒体内容

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