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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

增加由 CloudFront 边缘缓存提供服务的请求的比例(缓存命中率)

您可以通过增加由 CloudFront 边缘缓存提供服务的查看器请求的比例(而不是转至源服务器以获得内容)来提高性能。此做法称为提高分配的缓存命中率。

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

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

要增加缓存命中率,可以配置原始设备来添加 Cache-Control max-age 对象指令,并指定最长实际值 max-age...缓存持续时间越短,频率越频繁 CloudFront 将请求转发到您的原点,以确定对象是否已更改并获得最新版本。有关更多信息,请参阅 管理内容保留在边缘缓存中的时间长度(过期)。)

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

如果您将 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 最多将每个对象的 6 个不同的请求转发到源。如果源仅基于其中一个 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 设备类型标头 CloudFront-Is-Desktop-ViewerCloudFront-Is-Mobile-ViewerCloudFront-Is-SmartTV-Viewer,和 CloudFront-Is-Tablet-Viewer...此外,如果您还在返回平板电脑和桌面的相同版本的图像,则只能转发 CloudFront-Is-Tablet-Viewer 标题,而非 CloudFront-Is-Desktop-Viewer 标题。

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

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

默认情况下,当 CloudFront 接收请求时,它会检查 Accept-Encoding 标头的值。如果标头的值包含 gzip,则 CloudFront 会将标头和值 gzipAccept-Encoding: gzip— 添加到缓存密钥,然后将其转发至源。此行为可确保 CloudFront 为一个对象或对象的一个压缩版本(具体取决于 Accept-Encoding 标头的值)提供服务。

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

  • 标头名称Accept-Encoding

  • 标题值: 保持空白。

在您使用此配置时,CloudFront 从缓存密钥中删除 Accept-Encoding 标头,而不会将标头转发到源。此配置应用于 CloudFront 从该源通过分发所提供的所有内容。

使用 HTTP 提供媒体内容服务

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