Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)
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 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 接收请求时,它会检查 Accept-Encoding 标头的值。如果标头的值包含 gzip,则 CloudFront 会将标头和值 gzipAccept-Encoding: gzip— 添加到缓存密钥,然后将其转发至源。此行为可确保 CloudFront 服务为一个对象或对象的一个压缩版本,具体取决于 Accept-Encoding 标头的值。

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

  • 标头名称Accept-Encoding

  • 标头值:(留空)

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

使用 HTTP 提供媒体内容服务

有关优化按需和流视频内容的信息,请参阅使用 CloudFront 的按需和实时流视频