问题场景
用户使用阿里云CDN加速服务以后出现508错误。我们先来看一下,Http_code 508的定义:
The server terminated an operation because it encountered an infinite loop while processing a request with "Depth: infinity". This status indicates that the entire operation failed。
Source: RFC5842 Section 7.2
也就是说,服务器在处理请求时陷入死循环,此状态表示整个操作失败。
问题阐述
从上面的CDN的508错误里,可以看到CDN返回的Response Headers里,x-alicdn-da-ups-status响应了508,eagleid响应了两个值。通常情况下,一次通过CDN加速的请求,eagleid只会记录一个值,用于唯一标识这次请求,像这种情况,eagleid记录了多个值,说明这个请求在CDN里循环了。造成这个现象的可能原因一般有如下两种情况:
- CDN的源站也是在阿里CDN上加速的,比如CDN的源站域名也是用了一个阿里CDN域名。
- CDN的源站有一些代理的逻辑,会将CDN加速域名的请求代理到另外一个走阿里CDN加速的域名上。
这里请注意,因为数据的走向是:客户端-->CDN-->源站。如果源站也是走了CDN的话,就会变成:客户端-->CDN-->源站-->CDN-->源站...以此循环,这种情况就可能导致回环的情况,出现508。CDN产品本身有限制,要求CDN的源站不能是走阿里CDN加速,这是一种非标准化的操作。
另外还有一种定位方法,可以直接绑定Host到源站去测试,也就是不通过CDN访问,然后看返回的Response headers响应头,是否带有CDN的特殊header头,一般就是看Via头就可以了(阿里云CDN返回的header里会带有Via头),可以参考下图。如果直接访问源站的时候,源站返回的header头却有CDN特有的header头,那就说明源站有请求CDN的逻辑。
特别注意
CDN添加域名的时候,CDN控制台会做判断,如果用户填写的源站域名是阿里CDN加速域名的话,会直接报错。但是有两种情况目前CDN层面还无法避免,需要用户侧去修改:
- 用户配置加速域名A的源站域名是域名B,此时域名B未走CDN加速,因此域名A的源站可以配置成功。但是配置成功以后,用户将域名B添加到CDN上做加速。
- 用户配置的源站不走CDN,但是源站会做一些代理,例如方向代理,把CDN加速域名的请求代理到另外一个CDN加速域名,这种情况CDN也是无法提前监测到的。