CDN回源时网站出现5xx报错的排查方法

问题描述

当您使用阿里云CDN加速站点访问资源后,客户端的请求将首先发送到CDN的L1节点(一级节点),再回源到L2节点(二级节点),然后再回源到源站。因此如果访问过程中出现问题,可能涉及到多级网络链路的问题。当CDN回源源站异常失败时就会出现5xx的错误,主要包括502 Bad Gateway503 Service Temporarily Unavailable504 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的方法如下:

  1. 登录CDN控制台

  2. 在左侧导航栏,选择内容分发服务>监控查询>实时监控,观察近期带宽和QPS指标,检查带宽和QPS是否有突增的情况,如有突增情况发生,可能会导致回源后造成源站带宽压力过高,从而引发源站响应超时。 image.png

  3. 如果CDN透传回源的带宽有突增情况,则应检查是否有新资源发布,或者检查热点资源是否配置了缓存规则。如果您的游戏类或图片类业务较多,则建议在发布前通过CDN预热功能将资源提前布置到CDN上,避免瞬间回源带宽过高造成源站瓶颈。同时,需要针对热点资源添加长期缓存策略。

  4. 检查CDN侧和源站是否配置了缓存规则。如果源站配置了no-cache响应头,则其优先级高于CDN侧。如果源站和CDN侧都没有配置缓存规则,则默认缓存10~3600秒,关于缓存规则的更多信息,请参见缓存概述

    如果您刚接入CDN业务,对CDN业务没有缓存经验,可以对目录类型的资源配置一个最大的缓存范围。然后针对您不需要缓存的资源,单独配置一条策略,后续可通过优先级来控制匹配顺序。具体操作,请参见配置缓存过期时间

步骤四:源站不通或源站域名无法解析的排查

CDN节点都是公网上的节点,CDN配置的源站必须要连通公网。如果配置的源站IP公网不可达、端口不通或者源站域名没有解析,则会导致CDN回源请求源站失败,报错5XX。常见的几种异常情况如下:

  1. 源站网络不通,无法ping通源站IP。测试命令如下。

    ping [$IP]
    说明

    [$IP]为源站IP。

  2. 源站端口不通或源站直接返回5XX错误。如下操作所示,telnet端口报Connection timed out错误。

    1. 如果源站端口配置的是80,则测试80端口是否通,命令如下。

      telnet [$IP] 80
    2. 如果源站端口配置的是443,则测试443端口是否通。如果源站端口配置的是自定义端口,则测试自定义端口是否通。

    3. 可以在CDN控制台获取配置的源站地址和端口,然后在本地hosts文件中绑定源站。您可以固定源站做七层测试,查看是否是源站无响应或源站直接响应5XX。也可以使用curl命令测试绑定源站,测试命令如下。

      • 源站端口是80:curl -voa http://[$Domain] -x [$IP]:80

        说明

        [$Domain]为加速域名。

      • 源站端口是443:curl -voa https://[$Domain] --resolve [$Domain]:443:[$IP]

  3. 源站配置的是域名,但是源站域名未配置解析,则会导致CDN请求源站失败。可以使用pingnslookup命令检查源站域名的解析是否正常。例如,源站域名为example.aliyundoc.com,ping源站域名example.aliyundoc.com报unknown host错,使用nslookup域名查询源站域名的DNS记录报server can't find example.aliyundoc.com: NXDOMAIN错,都表示域名未解析。如何配置域名解析请参见配置CNAMEimage.png

步骤五:检查CDN回源配置

CDN配置了HTTPS回源,但源站不支持HTTPS也会导致访问资源返回5xx错误,请根据业务参见以下操作排查:

  1. 源站端口配置成443,但源站不支持HTTPS。在CDN控制台的源站配置界面,如果源站端口配置成443,则CDN回源的时候是HTTPS回源到源站的443端口。源站需要开放443端口,且配置HTTPS证书。

    • 如果源站不支持HTTPS访问,则CDN回源失败,报5XX错。对于这种情况,可以把回源端口改成80。

    • 如果业务需要443回源,那么需要在源站配置HTTPS证书。 image.png

  2. CDN配置了协议跟随回源,但是源站不支持HTTPS访问。协议跟随回源如果设置成HTTPS,则CDN是以HTTPS回源。协议跟随回源如果设置成跟随,则当客户端是HTTPS访问的时候,CDN是HTTPS回源。源站不支持HTTPS的情况下,会出现访问失败。对于这种情况,需要关闭协议跟随回源功能,或设置为HTTP回源。

    image.png

  3. 可以通过curl命令绑定源站进行测试,测试命令如下。

    curl -voa https://[$Domain] --resolve [$Domain]:443:[$IP]

    系统显示类似如下。

  4. 也可以修改本地hosts文件绑定到源站,用浏览器发起HTTPS访问。以下案例报错您的连接不是私密连接,则表示不支持HTTPS访问。

场景二:使用CDN+OSS的业务架构

如果您使用了CDN+OSS的业务架构,可参见以下内容排查问题:

  1. 登录对象存储控制台,单击左侧导航栏的常用工具与服务,参考ossutil相关文档,并使用ossutil命令行工具的--probe-item选项,检查OSS的下行带宽是否超过10GBps,QPS访问是否超过10000次/秒。如果OSS超过限制规则,则会触发OSS的流控,对超过限制的回源请求进入慢速处理。关于OSS的流控规则,请参见使用限制

    说明
    • 关于如何使用ossutil命令行工具的--probe-item选项,请参见查看选项

    • 慢速处理不是直接返回不可用的状态,仅是对超过限制的请求处理进行降速处理。

  2. 检查CDN回源的下行流量是否超过了源站的带宽限制,源站带宽被打满后会导致连锁的网络反应和应用层的问题。

    说明
    • 检查两个节点间传输的流量可以使用iperf工具。

    • 检查网络连接数可以使用Netstat工具。

  3. 检查源站是否有防火墙限制,即源站是否对回源请求做过限速或者IP限制。

  4. 若之前的排查结果均正常,可以分析源站Web服务的报错日志,检查日志中是否有5xx报错信息出现。若未在应用层的日志文件中发现报错记录,则可以反向测试源站到CDN节点的链路,检查是否有网络间链路抖动导致的5xx报错,具体以现场实际发生的频率和业务状况为准。

    说明

    一般情况下,源站带宽如果容易被打满,或者容易发生丢包或延迟的情况,则建议将Nginx的nginx.conf配置文件中的send timeout或者read timeout参数调大一些。