问题描述
当您使用阿里云CDN加速站点访问资源后,客户端的请求将首先发送到CDN的L1节点(一级节点),再回源到L2节点(二级节点),然后再回源到源站。因此如果访问过程中出现问题,可能涉及到多级网络链路的问题。当CDN回源源站异常失败时就会出现5xx的错误,主要包括502 Bad Gateway
、503 Service Temporarily Unavailable
、504 Gateway Time-out
。
问题原因
通过阿里云CDN访问出现5xx错误,在响应的Response Header中X-Swift-Error字段会有相关的错误,例如forward retry timeout
或者orig response 5xx error
,同时用CURL测试,或者浏览器Network开发者模式下可以查看这个请求消耗的时间。
如果是全局都是5xx的错误,通常就是CDN的配置错误或者源站错误导致的,以下原因会导致CDN回源失败:
源站不通或源站域名无法解析
CDN配置了HTTPS回源但源站不支持HTTPS
源站开启了SNI校验但CDN没有开启回源SNI
如果只是部分区域有问题,或者问题是偶尔出现,那么有可能跟部分地区回源网络或其他因素有关,例如以下场景:
比如源站的安全策略把部分CDN节点IP屏蔽,就会导致对应区域的用户访问CDN异常。
比如源站侧网络不稳定、回源跨境链路不稳定或者源站动态接口响应速度不稳定,就会有偶尔出现5xx的情况。
解决方案
阿里云CDN(Content Delivery Network)建立并覆盖在承载网上,是由不同区域的服务器组成的分布式网络,也是将源站资源缓存到全国各地的边缘服务器的网站加速产品。当您初次访问或缓存到期后,服务器会透传回到源站,其中源站的响应时间和首字节时间对回源请求的处理非常重要。如果您的网站在CDN回源时出现5xx报错的情况,请参见以下方法进行排查:
场景一:CDN源站是客本地主机或ECS
如您的源站是本地主机或ECS,请参见以下步骤进行排查处理:
步骤一:获取HTTP的响应头信息
如果访问网站出现5xx报错,可以通过CURL或者wget测试工具获取HTTP的响应头信息。可以参考以下命令,获取HTTP中的响应头信息。
您也可以进入指定浏览器,按F12
键,然后单击Network,检测定位请求5xx报错的URL资源。
curl -vo [$File_Name] [$IP]
[$File_Name]:在当前目录新建文件的文件名,访问网站的输出会存放于该文件中。
[$IP]:访问网站的IP地址。
系统返回类似如下,X-Swift-Error
返回“orig response 5xx error”信息,这是因为CDN回源站响应超时,或者源站处理超时导致的。
在获取了访问网站的HTTP响应信息后,可以参考以下几个方面,进行问题排查。
步骤二:根据出现报错的区域范围进行测试和分析
可以使用Networkbench或者17CE检查网站在各地节点的网络性能。请根据出现报错的区域范围进行以下监测和分析:
单地区访问网站出现5xx报错:可能与节点到源站的运营商链路有关,可尝试多测试几次,检查能否恢复网络。如果出现报错造成的影响较严重,建议保留response header响应头信息后,联系阿里云技术支持进行排查。
大面积地区访问网站出现5xx报错:可以参考以下命令,分别测试客户端到源站以及客户端到CDN节点的通信质量,并作对比。
time telnet [$Test_IP] [$Test_Port] ping [$Test_IP]
说明第一条命令可以获取执行
telnet
命令时使用的时间。第二条命令可以测试网络的连通性。
[$Test_IP]:待检测的IP地址,可以为源站IP地址或CDN节点IP地址。
[$Test_Port]:待检测网站的端口号,可以为源站的端口号或CDN节点的端口号。
步骤三:检查域名整体的业务带宽和QPS
检查域名整体的业务带宽和QPS的方法如下:
登录CDN控制台。
在左侧导航栏,选择内容分发服务>监控查询>实时监控,观察近期带宽和QPS指标,检查带宽和QPS是否有突增的情况,如有突增情况发生,可能会导致回源后造成源站带宽压力过高,从而引发源站响应超时。
如果CDN透传回源的带宽有突增情况,则应检查是否有新资源发布,或者检查热点资源是否配置了缓存规则。如果您的游戏类或图片类业务较多,则建议在发布前通过CDN预热功能将资源提前布置到CDN上,避免瞬间回源带宽过高造成源站瓶颈。同时,需要针对热点资源添加长期缓存策略。
检查CDN侧和源站是否配置了缓存规则。如果源站配置了no-cache响应头,则其优先级高于CDN侧。如果源站和CDN侧都没有配置缓存规则,则默认缓存10~3600秒,关于缓存规则的更多信息,请参见缓存概述。
如果您刚接入CDN业务,对CDN业务没有缓存经验,可以对目录类型的资源配置一个最大的缓存范围。然后针对您不需要缓存的资源,单独配置一条策略,后续可通过优先级来控制匹配顺序。具体操作,请参见配置缓存过期时间。
步骤四:源站不通或源站域名无法解析的排查
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文件中绑定源站。您可以固定源站做七层测试,查看是否是源站无响应或源站直接响应5XX。也可以使用
curl
命令测试绑定源站,测试命令如下。源站端口是80:
curl -voa http://[$Domain] -x [$IP]:80
说明[$Domain]为加速域名。
源站端口是443:
curl -voa https://[$Domain] --resolve [$Domain]:443:[$IP]
源站配置的是域名,但是源站域名未配置解析,则会导致CDN请求源站失败。可以使用
ping
和nslookup
命令检查源站域名的解析是否正常。例如,源站域名为example.aliyundoc.com,ping源站域名example.aliyundoc.com报unknown host
错,使用nslookup域名查询源站域名的DNS记录报server can't find example.aliyundoc.com: NXDOMAIN
错,都表示域名未解析。如何配置域名解析请参见配置CNAME。
步骤五:检查CDN回源配置
CDN配置了HTTPS回源,但源站不支持HTTPS也会导致访问资源返回5xx错误,请根据业务参见以下操作排查:
源站端口配置成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访问。
场景二:使用CDN+OSS的业务架构
如果您使用了CDN+OSS的业务架构,可参见以下内容排查问题:
登录对象存储控制台,单击左侧导航栏的常用工具与服务,参考ossutil相关文档,并使用ossutil命令行工具的
--probe-item
选项,检查OSS的下行带宽是否超过10GBps,QPS访问是否超过10000次/秒。如果OSS超过限制规则,则会触发OSS的流控,对超过限制的回源请求进入慢速处理。关于OSS的流控规则,请参见使用限制。说明关于如何使用ossutil命令行工具的
--probe-item
选项,请参见查看选项。慢速处理不是直接返回不可用的状态,仅是对超过限制的请求处理进行降速处理。
检查CDN回源的下行流量是否超过了源站的带宽限制,源站带宽被打满后会导致连锁的网络反应和应用层的问题。
说明检查两个节点间传输的流量可以使用iperf工具。
检查网络连接数可以使用Netstat工具。
检查源站是否有防火墙限制,即源站是否对回源请求做过限速或者IP限制。
若之前的排查结果均正常,可以分析源站Web服务的报错日志,检查日志中是否有5xx报错信息出现。若未在应用层的日志文件中发现报错记录,则可以反向测试源站到CDN节点的链路,检查是否有网络间链路抖动导致的5xx报错,具体以现场实际发生的频率和业务状况为准。
说明一般情况下,源站带宽如果容易被打满,或者容易发生丢包或延迟的情况,则建议将Nginx的nginx.conf配置文件中的
send timeout
或者read timeout
参数调大一些。