增加直接从 CloudFront 缓存提供服务的请求的比例(缓存命中率)
您可以通过增加直接从 CloudFront 缓存提供服务的查看器请求的比例(而不是转至源服务器以获得内容)来提高性能。这称为提高缓存命中率。
以下部分说明了如何提高缓存命中率。
主题
指定 CloudFront 缓存对象的时间长度
要提升缓存命中率,您可以配置源来将 Cache-Control max-agemax-age
指定在实践中可行的最长值。缓存持续时间越短,CloudFront 将请求发送到源(用以确定对象是否已更改,并获取最新版本)的次数就越多。有关更多信息,请参阅管理内容保留在缓存中的时间长度(过期)。
使用 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 分别缓存源返回的对应对象,即使这些对象完全相同。如果您仅使用A
或a
,CloudFront 会将较少的请求转发到源。 -
按相同的顺序列出参数。与大小写不同的情况相似,如果对象的一个请求包含查询字符串
parameter1=a¶meter2=b
,而相同对象的另一个请求包含parameter2=b¶meter1=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 如何处理请求并将请求转发到您的 Amazon S3 源服务器 > CloudFront 删除或更新的 HTTP 请求标头
-
CloudFront 如何处理请求及如何将请求转发给您的自定义源服务器 > HTTP 请求标头和 CloudFront 行为(自定义源和 S3 源)
当您将 CloudFront 配置为基于请求标头进行缓存时,无需更改 CloudFront 转发的标头,仅更改 CloudFront 是否基于标头值缓存对象。
-
-
尝试避免基于具有大量唯一值的请求标头进行缓存。
例如,如果您希望基于用户设备提供不同大小的图像,不要将 CloudFront 配置为基于
User-Agent
标头进行缓存,这会导致大量可能的值。而应该将 CloudFront 配置为基于 CloudFront device-type 标头CloudFront-Is-Desktop-Viewer
、CloudFront-Is-Mobile-Viewer
、CloudFront-Is-SmartTV-Viewer
和CloudFront-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 的点播视频和实时流视频。