问题分析
通过阿里云CDN访问出现5xx错误,在响应的Response Header里的X-Swift-Error字段会有相关的错误,例如forward retry timeout或者orig response 5xx error,同时用curl测试或者浏览器Network开发者模式下可以看这个请求消耗的时间。
遇到这类问题可以初步分析,如果是全局都是5xx的错误,通常就是CDN的配置错误或者源站错误导致的,比如“源站不通或源站域名无法解析”、“CDN配置了HTTPS回源,但源站不支持HTTPS”、“源站开启了SNI校验,但是CDN没有开启回源SNI”等,这些配置会导致CDN必然会回源失败,响应5xx错误。如果只是部分区域有问题,或者问题是偶发出现的,那么有可能跟部分地区回源网络或其他因素有关。比如源站的安全策略把部分CDN节点IP屏蔽了,就会导致对应区域的用户访问CDN异常;比如源站侧网络不稳定或者回源跨境链路不稳定或者源站动态接口响应速度不稳定,就会有偶发出现5xx的情况。
nginx对于502/503/504的错误解释如下
详细信息
一. 源站不通或源站域名无法解析
CDN 都是公网上的节点,CDN配置的源站必须要公网可达。如果配置的源站IP公网不可达、端口不通或者源站域名没有解析,则会导致CDN回源请求源站失败,报错5xx。
常见的几种异常情况如下:
(1)源站网络不通,测试无法ping通源站IP。ping测试命令:ping 源站IP
(2)源站端口不通或源站直接响应5xx错误。例如以下案例,telnet端口报错Connection timed out
i)如果源站端口配置的是80,则测试80端口是否通:telnet 源站IP 80
ii)如果源站端口配置的是443,则测试443端口是否通。如果源站端口配置的是自定义端口,则测试自定义端口是否通。
iii)可以在CDN控制台获取配置的源站地址和端口,然后本地host绑定到源站,固定源站做七层测试,查看是否是源站直接无响应或源站直接响应5xx,具体可以参考这里。
(3) 源站配置的是域名,但是源站域名未配置解析,会导致CDN请求源站失败。可以用ping和nslookup命令检查源站域名的解析是否正常。例如以下案例,配置源站域名www.a.com,ping www.a.com报错unknown host,nslookup unknown host报错server can't find www.a.com: NXDOMAIN,表示域名未解析。
二.CDN配置了HTTPS回源,但源站不支持HTTPS
(1)源站端口配置成443,但源站不支持HTTPS
在CDN控制台的源站配置界面,如果源站端口配置成443,则CDN回源的时候是HTTPS回源到源站的443端口。源站需要开放443端口,且配置HTTPS证书。如果源站不支持HTTPS访问,则CDN回源失败,报错5xx。对于这种情况,可以把回源端口改成80;如果业务需要443回源的话,那么需要在源站配置HTTPS证书。
(2)CDN配置了协议跟随回源,但是源站不支持HTTPS访问。
协议跟随回源如果设置成“HTTPS”,则CDN是以HTTPS回源;协议跟随回源如果设置成“跟随”,则当客户端是HTTPS访问的时候,CDN是HTTPS回源。源站不支持HTTPS的情况下,会出现访问失败。对于这种情况,需要关闭协议跟随回源功能,或设置为HTTP回源。
可以通过curl命令直接绑定到源站去测试,测试命令:curl -voa http://dc.xxx.cn --resolve dc.xxx.cn:443:a.a.a.a (dc.xxx.cn是CDN加速域名,a.a.a.a是源站IP)
也可以修改本地etc/hosts文件绑定到源站,用浏览器发起HTTPS访问。以下案例报错“您的连接不是私密连接”,则表示不支持HTTPS访问。
三.源站开启了SNI校验,但是CDN没有开启“回源SNI”
CDN回源默认是不带SNI信息的,如果您的源站IP绑定了多个域名,当CDN节点以HTTPS协议访问您的源站时,由于没有带SNI信息,会导致源站无法正确响应HTTPS证书,导致回源失败。因为这个问题导致的错误,一般是503 Service Temporarily Unavailable错误,而且很快就会返回这个错误。您可以在CDN控制台设置开启回源SNI,指明具体访问域名。具体SNI的介绍以及配置方法参考这里。
四.源站存在安全防护规则
源站的相关安全防护规则导致的CDN回源异常,通常会在10秒以内就返回5xx错误,大部分情况会返回503 Service Temporarily Unavailable的错误,具体的排查方法和解决方案可以参考文档源站安全策略导致5xx。
(1)源站服务器开启了安全组限制,限制了CDN节点的访问
(2)源站服务器配置了单IP访问次数限制,把CDN的回源IP当成了异常IP
(3)源站存在云锁、安全狗、防火墙等安全策略,拦截了CDN的回源IP
(4)源站Web服务异常或服务器超载
例如下图就是一种比较典型的TCP超时,每次访问到10秒的时候就超时断开了,响应504。
五. 源站超时无响应导致CDN回源超时
CDN 回源有严格的超时时间,四层 TCP 是 10 秒超时,七层HTTP / HTTPS是 30 秒超时,当超过该时间时即使后续源站响应正常也是会返回 5xx错误,通常因CDN回源超时导致的问题,会响应504Gateway Time-out错误。可以绑定源站去测试源站的响应速度,如果超过30秒,需要检查源站服务,优化源站的响应速度,确保源站返回请求时间控制在一个较短的时间内,另外也可以申请延长CDN域名的默认超时时长,详细请参考配置回源请求超时时间。
请注意这个回源超时时间的配置是设置HTTP层面的超时时间,如果TCP层面就已经超时,那么这个设置是不生效的。
通常这类回源超时的问题发生在一些动态请求上,比如请求源站的程序、数据库、接口等,源站处理需要一些时间。这类情况建议源站使用 CDN 的站点都做动静分离改造,静态资源用CDN加速域名,动态资源直接用源站域名,因为如果源站响应慢,部分动态资源可能出现 30 秒仍然无法响应的情况。
六. 跨境回源或源站侧网络异常
回源存在跨境链路导致的CDN回源超时,响应5xx错误。例如源站在境外,中国大陆的用户访问的时候,是先访问到中国大陆的CDN节点,然后中国大陆的CDN节点走跨境链路,回源到境外的源站;亦或者源站在中国大陆,境外用户访问的时候先请求到境外的CDN节点,境外的CDN节点走跨境链路,回源到中国大陆的源站。由于CDN回源走的都是公网,这种情况涉及到跨境链路,需要走国际互联网出口以及境外运营商的链路,本身就存在一定的不稳定因素。还有一种情况是源站侧机房的网络差,或源站侧网络不稳定。
通常这两类问题CDN层面的优化难度比较大,因为CDN只是提供了节点,做缓存服务,很难去控制公网的网络以及源站侧的网络。对于源站侧网络的问题,建议优化源站;对于跨境回源的问题,建议优化CDN的缓存命中率,尽量减少回源,降低5xx比率。或者考虑使用海外源站+国内源站的双源站架构。
在一些静态加速没有命中缓存,回源又一直超时的情况,可以考虑使用全站加速的动态加速,动态加速通过智能路由技术为动态内容,进行路由决策,选择最佳回源路径,会有一定的优化效果,但是不一定能完全解决此类问题。
相关文档
域名绑定Host操作
源站存在安全防护等原因导致访问CDN域名报503错误
回源请求超时时间
使用CDN后访问域名提示“504”Gateway Time-out"错误
适用于
CDN
DCDN