本文为您介绍CDN缓存相关的常见问题。
CDN缓存清理机制是什么?
缓存存在CDN节点上的资源,如果该资源的访问热度较低(同一个CDN节点上的同一个资源被客户端访问的频次较低),那么很可能会在缓存过期之前被CDN节点上其他访问热度较高的资源覆盖。
CDN默认的缓存规则是什么?
CDN节点在收到源站响应的静态文件资源的时候,会按照以下的缓存规则来执行(数值越小,优先级越高):
源站响应
pragma:no-cache
、cache-control:no-cache
(或者no-store
,或者max-age=0
)时,不缓存。CDN控制台设置的缓存过期时间或者状态码过期时间。
说明若CDN请求同时命中多条规则,有且仅有一条规则会生效,优先级为:权重>规则创建时间。
有多条缓存规则的情况下,建议每条缓存规则都设置不同的权重(权重越大优先级越高),通过权重来控制规则执行优先级。
权重相同的规则生效优先级:先创建的>后创建的,与规则类型无关。
源站配置其他缓存规则,优先级由高至低为:
cache-control
>expires
>last-modified
>ETag
。源站响应中使用
cache-control
设置过期时间,取值为max-age
或s-maxage
,并且max-age
或s-maxage
的值大于0,例如:cache-control:max-age=3600。如果同时存在max-age
和s-maxage
,则以s-maxage
的值为准。源站响应中使用
expires
设置过期时间,例如:expires:Tue, 25 Nov 2031 17:25:43 GMT。源站响应中携带了
ETag
或last-modified
,则使用以下规则来计算缓存时间:有
last-modified
,使用公式(当前时间-last-modified
)* 0.1,计算结果在10秒~3600秒之间的,取计算结果时间;小于10秒的,按照10秒处理;大于3600秒的,按照3600秒处理。只有
ETag
,缓存10秒。
源站返回的数据中
ETag
、last-modified
、cache-control
和expires
这些缓存相关的响应头都没有携带,则默认不缓存。
如何判断CDN缓存是否成功?
阿里云CDN对于文件是否支持缓存,您可以通过检查HTTP响应头中的相关字段来判断。
X-Cache
: 表示请求是否命中CDN缓存。值为HIT表示命中,MISS或者字段不存在表示未命中。Age
: 表示文件在CDN节点上缓存的时间(秒)。文件被刷新或首次访问无此字段。Age
为0表示缓存过期,需回源校验。X-Swift-CacheTime
: 表示文件在CDN节点上的允许缓存时间。计算剩余缓存时间:X-Swift-CacheTime
–Age
。X-Swift-SaveTime
:表示资源首次被缓存到CDN节点上的时间(GMT)。转换为中国北京时间需加上8小时。
为了查看这些HTTP响应头,您可以通过以下两种方式查看您的内容是否缓存到CDN:
方式1:使用浏览器的开发者工具(如Chrome的开发者工具)
方式2:使用curl命令查看资源缓存情况
curl "http://example.com/path/to/response.html" -voa
如何解决URL的传递参数为变量导致CDN缓存命中率低的问题?
可能是因为没有开启CDN的忽略参数功能,详情请参见URL的传递参数为变量导致CDN缓存命中率低。
如何设置文件不缓存直接回源?
根据您的需求,针对不希望缓存的资源,按照目录、文件路径、文件类型设置对应的缓存时间,设置如下:
类型:选择目录或文件后缀名。
地址:填写您不想缓存的具体资源路径或文件名后缀,例如
php,jsp,asp
类型的动态文件和admin
目录下的所有文件。过期时间:设置为“0”,表示不缓存该类型的资源。
权重:可按照需要调整权重值,权重越高,优先级越强。
详情请参见配置缓存过期时间。
在CDN控制台缓存过期时间设置为0,为何访问到的资源仍然不是最新内容?
在CDN控制台将缓存过期时间设置为0,目的是每次请求都直接回源站获取最新内容。然而,如果您发现访问到的资源仍然不是最新的内容,可能有几个原因:
浏览器本地缓存:浏览器可能缓存了旧内容。建议清除浏览器缓存或使用无痕模式测试。
配置生效延迟:设置缓存时间为0后,可能需要时间让所有CDN节点生效。另外,如果CDN节点未检测到更改,可能仍返回旧缓存。
源站缓存未刷新:源站服务器可能有缓存机制,未及时更新时,CDN节点回源可能获取旧缓存。
节点缓存清除延迟:修改配置前已缓存的资源可能需要时间清除。您可以手动刷新缓存,确保立即获取最新内容,详情请参见刷新或预热资源。
源站变更文件后,CDN节点上的缓存会主动、实时更新吗?
源站变更文件后,CDN节点上的缓存不会主动、实时更新。缓存更新取决于配置的缓存策略。
CDN节点根据配置的缓存过期时间更新缓存。如果缓存未过期,源站变更文件不会立即反映在CDN缓存中,详情请参见配置缓存过期时间。
您可以通过CDN提供的刷新缓存手动清除缓存,使下一次请求回源获取最新的内容。
通过控制台操作:刷新或预热资源
调用API接口:RefreshObjectCaches - 刷新缓存
影响CDN缓存命中率下降的因素有哪些?
影响阿里云CDN缓存命中率下降的因素如下:
刷新缓存:手动或自动刷新缓存操作可能导致短时间内命中率下降。
带宽突增:当带宽在短时间内大幅度增加时,会导致CDN节点回源请求增多,从而降低缓存命中率。
CDN节点访问新内容:如果CDN节点频繁访问首次请求的新内容,也会导致回源较多,进而表现出缓存命中率的下降趋势。
缓存规则调整:对CDN缓存策略进行修改或调整可能会影响缓存命中率,例如未配置合适的缓存过期时间或者缓存策略设置不当。
URL中带有可变参数:URL中问号(?)后的参数变化会导致不同的URL请求被视为不同的资源,即使实际指向的是同一份内容,这也会造成CDN缓存命中率降低。
未合理配置缓存过期时间:对于不同更新频率的静态文件,如未根据实际情况设置合理的缓存过期时间,可能会导致缓存资源过早失效,从而影响缓存命中率。
更多场景关于影响缓存命中率的因素介绍请参见提高CDN缓存命中率。具体可参见刷新和预热资源、忽略参数和配置缓存过期时间。
如何排查CDN缓存命中率较低的问题?
缓存命中率低会导致加载速度变慢和源站负载增加。请参见CDN缓存命中率较低排查方法。
如何设置缓存全局生效?
您可以通过设置缓存过期时间来实现缓存全局生效。设置时,类型选择目录后,在地址栏用正斜线(/)匹配所有目录。具体操作请参见配置缓存过期时间。
缓存配置为什么没有生效?
如果您配置了缓存规则,在使用过程中发现此缓存规则未生效,可能是以下原因:
生效延迟:缓存规则的修改或新增通常需要一段时间才能生效,请您在规则生效后再验证。
缓存更新机制:新规则不会立即应用到已缓存的内容,需要等到原缓存过期后才会生效。
缓存刷新操作未执行:更改缓存设置后,如果没有手动刷新缓存,旧的缓存内容将继续被提供给用户,直到自然过期。详情请参见刷新和预热资源。
缓存响应头设置不当:检查源站发送的HTTP响应头里的
Cache-Control
和Expires
标头是否正确设置。缓存规则有优先级:若CDN请求同时命中多条规则,优先级为:权重>规则创建时间。
有多条缓存规则的情况下,建议每条缓存规则都设置不同的权重(权重越大优先级越高),通过权重来控制规则执行优先级。
权重相同的规则生效优先级:先创建的>后创建的,与规则类型无关。
配置示例:为加速域名
demo.aliyun.com
配置以下缓存策略,CDN节点回源下载资源http://demo.aliyun.com/image/example.png
,虽然以下两条规则都匹配到了,但是因为这两条规则的权重相同,因此要判断规则创建的时间,先创建的规则优先级高于后创建的,因为目录/image这条规则创建的时间更早,所以系统最终生效的是目录类型这条规则。
通过HTTP响应头配置CDN跨域资源共享(CORS)及注意事项
设置适当的HTTP响应头,允许来自不同源的请求访问资源,详情请参见配置跨域资源共享。
为什么已经配置了响应头Access-Control-Allow-Origin,但是访问资源仍提示跨域问题,response header中没有配置的响应头?
如果您在阿里云CDN中配置了Access-Control-Allow-Origin
等回源响应头,但客户端仍遇到跨域问题且响应头中没有这些配置,可能原因如下:
可能的原因
配置未生效或错误:配置未正确设置或尚未生效。
CDN缓存:CDN节点缓存了旧的响应头。
源站问题:源站的跨域响应头与CDN配置冲突。
浏览器缓存:浏览器缓存了旧的响应。
解决方案
验证配置:确认CDN配置已正确设置并生效。
清除CDN缓存:使用CDN的刷新功能清空缓存,然后再次访问资源。具体请参见刷新和预热资源。
检查源站设置:确认源站不会返回与CDN配置冲突的跨域响应头。建议统一源站和CDN的跨域头设置。
清除浏览器缓存:清空浏览器缓存,或使用无痕模式测试。
联系技术支持:如果问题仍然存在,请联系阿里云CDN技术支持。
节点HTTP响应头和回源HTTP响应头有什么区别?
节点HTTP响应头和回源HTTP响应头在缓存架构中代表不同环节的HTTP头部信息。
节点HTTP响应头:由CDN节点发送给客户端(如浏览器)的HTTP响应头。当CDN节点有缓存内容时,会直接返回给客户端,无需向源站请求。
回源HTTP响应头:由源站发送给CDN节点的HTTP响应头。当CDN节点的缓存过期或未命中时,CDN点会向源站请求最新内容,源站返回的内容及相关HTTP头部信息就是回源响应头。
因此,节点HTTP响应头和回源HTTP响应头的区别在于它们的应用场景和控制对象不同。节点HTTP响应头用于控制客户端和CDN节点的缓存行为,而回源HTTP响应头用于控制源站与CDN节点之间的缓存行为。它们通常共同使用,以实现高效、精确的缓存控制。关于回源HTTP响应头的更多信息,请参见配置回源HTTP响应头。
异常状态码缓存规则是什么?
对于204、305、400、403、404、405、414、500、501、502、503和504状态码,缓存规则如下图所示:
请求通过配置Range回源时,缓存规则如下:
非200、206状态码(包含但不限于204、305、400、403、404、405、414、500、501、502、503和504状态码)的情况下,均不缓存。
200、206状态码按照阿里云CDN默认缓存规则及优先级进行缓存。
收到5xx状态码会删除已缓存的分片文件(回源超时不会删除缓存文件)。
说明Range回源情况下,源站会把一个大文件分割成多个小的文件分片来返回给CDN节点。比如有个文件被分割成了10个分片,CDN节点已经缓存了5个分片,在请求第6个分片时,源站响应了5xx状态码,这时会把前面已经缓存的5个分片全部删除。
请求未通过配置Range回源时,按照如下规则缓存:
如果源站返回
set-cookie
响应头,CDN不缓存。如果源站没有返回
Set-Cookie
响应头,则遵循CDN控制台配置的状态码过期时间来缓存,配置多条规则时生效方式请参考多条规则生效优先级说明。如果源站没有返回
Set-Cookie
响应头,CDN控制台也没有配置状态码过期时间,则按照源站设置的Pragma
、Cache-Control
或者Expires
响应头来缓存。如果源站没有返回
Set-Cookie
、Pragma
、Cache-Control
或者Expires
响应头,CDN控制台也没有配置状态码过期时间,则默认缓存1秒。
对于303、304、401、407、600和601状态码,CDN均不进行缓存。