通过CDN请求大文件自动断开

更新时间:

问题描述

通过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=0no-cache等不缓存的策略,将导致CDN无法缓存,这类请求会被CDN的Swift缓存组件断开。这主要是因为如果大文件请求不执行缓存,那么每次都需要回源,相当于CDN没有起到加速效果,而且对于CDN的回源带宽以及源站的性能都有影响。

解决方案

源站删除不缓存的Cache-Control头,支持CDN可以缓存此类文件。同时,对于大文件,如果源站支持Range,建议CDN层面开启Range回源功能。

适用于

  • CDN
  • DCDN