问题描述
通过CDN访问一个大文件,在请求过程中会自动断开。
排查思路
执行以下命令,分析返回结果。
curl -voa http://[$Address]
说明:[$Address]:指CDN的地址。
系统显示类似如下,发现存在“transfer closed with 158206570 bytes remaining to read”报错信息。
从报错信息可知,这个文件大于100MB。从Response Headers分析可以得到以下几个信息:
X-Cache: MISS TCP_MISS dirn:-2:-2
表示这是一个MISS的请求,是回源的。X-Swift-CacheTime: 0
表示这个请求是无法缓存到CDN上的,每次都需要回源。Cache-Control: public, max-age=0
表示这里源站响应了max-age=0
,是导致CDN无法缓存的原因。
问题原因
这个是产品层面的一个限制,对于超过100MB的文件,如果源站响应了Cache-Control为max-age=0
、no-cache
等不缓存的策略,将导致CDN无法缓存,这类请求会被CDN的Swift缓存组件断开。这主要是因为如果大文件请求不执行缓存,那么每次都需要回源,相当于CDN没有起到加速效果,而且对于CDN的回源带宽以及源站的性能都有影响。
解决方案
源站删除不缓存的Cache-Control头,支持CDN可以缓存此类文件。同时,对于大文件,如果源站支持Range,建议CDN层面开启Range回源功能。
适用于
- CDN
- DCDN