访问CDN加速域名返回5XX错误的常见问题
概述
当用户使用CDN加速域名后进行访问,客户端的请求将首先发送到CDN的L1节点,再通过L1—L2—源站的网络路径回源获取资源。因此如果访问过程中出现问题就可能涉及到多级网络链路的问题。当CDN回源源站异常失败时就会出现5XX的错误,主要的5XX错误如下:
- 502 Bad Gateway
- 503 Service Temporarily Unavailable
- 504 Gateway Time-out
很多情况下是因为一些细节被忽略了导致错误的发生,本文主要介绍一些常见的引发5XX错误的问题场景。
详细信息
问题分析
使用CDN访问出现5XX错误,在响应的Response Header中,X-Swift-Error
字段会有相关的错误,例如forward retry timeout
或者orig response 5xx error
,同时通过curl
命令或者浏览器开发者模式的Network标签下可以查看该请求花费的时间。
说明:
- 图中出现
503 Service Temporarily Unavailable
错误。- 图中
X-Swift-Error
字段报错为forward retry timeout
。- 图中相应时间为36秒。
请检查此问题是否为全局问题:
- 全局问题
通常是CDN的配置错误或者源站错误导致,导致CDN必然回源失败,返回5XX错误。常见的问题原因如下:- 源站不通或源站域名无法解析
- CDN配置了HTTPS回源,但源站不支持HTTPS
- 源站开启了SNI校验,但是CDN没有开启回源SNI
- 部分区域问题或偶发性问题
有可能和CDN回源网络或源站相关策略有关。常见的问题原因如下:- 源站的安全策略屏蔽了部分CDN节点IP
- 源站侧网络不稳定
- 回源跨境链路不稳定
- 源站动态接口响应速度不稳定
Nginx中502、503、504错误码的解释如下:
- 502
#define NGX_HTTP_BAD_GATEWAY 502 # connection reset, bad gateway (HTTP/1.1 502 Bad Gateway)
> (kevent() reported that connect() failed (61: Connection refused))
> (connect() failed (111: Connection refused) while connecting to upstream) - 503
#define NGX_HTTP_SERVICE_UNAVAILABLE 503 # limit qps/limit conn/ sysguard
- 504
#define NGX_HTTP_GATEWAY_TIME_OUT 504 # connection/read timeout (HTTP/1.1 504 Gateway Time-out)
问题案例
源站不通或源站域名无法解析
CDN节点都是公网上的节点,CDN配置的源站必须要连通公网。如果配置的源站IP公网不可达、端口不通或者源站域名没有解析,则会导致CDN回源请求源站失败,报错5XX。常见的几种异常情况如下。
- 源站网络不通,无法ping通源站IP。测试命令如下。
ping [$IP]
说明:[$IP]为源站IP。
- 源站端口不通或源站直接返回5XX错误。如下操作所示,telnet端口报
Connection timed out
错。- 如果源站端口配置的是80,则测试80端口是否通,命令如下。
telnet [$IP] 80
- 如果源站端口配置的是443,则测试443端口是否通。如果源站端口配置的是自定义端口,则测试自定义端口是否通。
- 可以在CDN控制台获取配置的源站地址和端口,然后在本地hosts文件中绑定源站,详细请参考域名绑定Host操作步骤,固定源站做七层测试,查看是否是源站无响应或源站直接响应5XX。也可以使用
curl
命令测试绑定源站,测试命令如下。- 源站端口是80:
curl -voa http://[$Domain] -x [$IP]:80
说明:[$Domain]为加速域名。
- 源站端口是443:
curl -voa https://[$Domain] --resolve [$Domain]:443:[$IP]
- 源站端口是80:
- 如果源站端口配置的是80,则测试80端口是否通,命令如下。
- 源站配置的是域名,但是源站域名未配置解析,则会导致CDN请求源站失败。可以使用
ping
和nslookup
命令检查源站域名的解析是否正常。例如,源站域名为example.aliyundoc.com,ping源站域名example.aliyundoc.com报unknown host
错,使用nslookup域名查询源站域名的DNS记录报server can't find example.aliyundoc.com: NXDOMAIN
错,都表示域名未解析。
CDN配置了HTTPS回源但源站不支持HTTPS
- 源站端口配置成443,但源站不支持HTTPS。在CDN控制台的源站配置界面,如果源站端口配置成443,则CDN回源的时候是HTTPS回源到源站的443端口。源站需要开放443端口,且配置HTTPS证书。如果源站不支持HTTPS访问,则CDN回源失败,报5XX错。对于这种情况,可以把回源端口改成80。如果业务需要443回源,那么需要在源站配置HTTPS证书。
- CDN配置了协议跟随回源,但是源站不支持HTTPS访问。协议跟随回源如果设置成HTTPS,则CDN是以HTTPS回源。协议跟随回源如果设置成跟随,则当客户端是HTTPS访问的时候,CDN是HTTPS回源。源站不支持HTTPS的情况下,会出现访问失败。对于这种情况,需要关闭协议跟随回源功能,或设置为HTTP回源。
- 可以通过
curl
命令绑定源站进行测试,测试命令如下。curl -voa https://[$Domain] --resolve [$Domain]:443:[$IP]
系统显示类似如下。 - 也可以修改本地hosts文件绑定到源站,用浏览器发起HTTPS访问。以下案例报错
您的连接不是私密连接
,则表示不支持HTTPS访问。
源站开启了SNI校验但是CDN没有开启“回源SNI”
CDN回源默认是不带SNI信息,如果您的源站IP绑定了多个域名,当CDN节点以HTTPS协议访问您的源站时,由于没有带SNI信息,会导致源站无法正确响应HTTPS证书,导致回源失败。因为该问题导致的错误一般是503 Service Temporarily Unavailable
错误,而且很快就会返回该错误。您可以在CDN控制台设置开启回源SNI,指明具体访问域名。具体SNI的介绍以及配置方法请参见配置回源SNI。
源站存在安全防护规则
源站的安全防护规则如下所示:
- 源站服务器开启了安全组限制,限制了CDN节点的访问。
- 源站服务器配置了单IP访问次数限制,把CDN的回源IP当成了异常IP。
- 源站存在云锁、安全狗、防火墙等安全策略软件,拦截了CDN的回源IP访问。
- 源站Web服务异常或服务器超载。
源站的相关安全防护规则导致的CDN回源异常,通常都是TCP超时,会在10秒或以内就5xx,且大部分情况会返回503 Service Temporarily Unavailable
的错误,具体的排查方法和解决方案可以参见源站存在安全防护等原因导致访问CDN域名报503错误。
源站超时无响应导致CDN回源超时
CDN回源有严格的超时时间,四层TCP是10秒超时,七层HTTP或HTTPS是30秒超时。当超过该时间时,即使后续源站响应正常也是会返回5XX错误,通常因CDN回源超时导致的问题,会返回504 Gateway Time-out
错误。可以绑定源站测试源站的响应速度,如果超过30秒,需要检查源站服务,优化源站的响应速度,确保源站返回请求时间控制在一个较短的时间内,另外也可以申请延长CDN域名的默认超时时长,详细配置请参见回源请求超时时间,具体解决方法请参见使用CDN后访问域名提示“504 Gateway Time-out”错误。
通常这类回源超时的问题常发生在一些动态请求上,比如请求源站的程序、数据库、接口等,源站处理需要一些时间。这类情况建议源站使用CDN的站点都做动静分离改造,静态资源用CDN加速域名,动态资源直接用源站域名,因为如果源站响应慢,部分动态资源可能出现30秒仍然无法响应的情况。
跨境回源或源站侧网络异常
回源存在跨境链路导致的CDN回源超时,返回502或504错误。例如源站在境外,中国境内的用户访问的时候,先访问到中国境内的CDN节点,然后中国境内的CDN节点走跨境链路,回源到境外的源站。
亦或者源站在中国境内,境外用户访问的时候先请求到境外的CDN节点,境外的CDN节点走跨境链路,回源到中国境内的源站。由于CDN回源走的都是公网,这种情况涉及到跨境链路,需要走国际互联网出口以及境外运营商的链路,本身就存在一定的不稳定因素。还有一种情况是源站机房的网络差,或源站网络不稳定。
通常这两类问题CDN层面的优化难度比较大,因为CDN只是提供了节点,进行缓存服务,很难把控公网的网络以及源站侧的网络。对于源站侧网络的问题,建议优化源站。对于跨境回源的问题,建议优化CDN的缓存命中率,尽量减少回源,降低出现5XX问题的比例,或者考虑海外源站+中国内地源站的双源站架构。
相关文档
适用于
- CDN
- DCDN