520/524状态码排障指南

当您使用腾讯云 EdgeOne 加速站点访问资源后,客户端的请求将发送至 EdgeOne 节点,再回源到源站。因此如果访问过程中出现问题,可能涉及到多层网络链路的问题。当 EdgeOne 回源源站失败时则会出现 52x 的错误,本文档将为您介绍当出现 520/524 状态码时,您应该如何排查。
如下,以 524 状态码为例:

定义

524 状态码是 EdgeOne 自定义的状态码。节点与源站 TCP 建连成功后,向源站发起请求,源站一直没有响应导致节点超时,则节点响应客户端 524 状态码。其它状态码的含义请参考 异常状态码参考


现象



可能的原因

源站自身服务异常
源站安全策略导致
运营商限制(HTTP)

排查方法

从第三方(非 CDN、源站)发起 HTTP/HTTPS 请求,指向源站测试,第三方可以是个人 pc、服务器、监测平台等。可以通过在服务器上使用命令行工具 CURL 来排查。

步骤一:确定回源配置信息

若您无特殊配置,则仅以「域名管理」处设置的源站、协议、以及端口为准即可。若有特殊配置,则可参照如下方法进行确定:
1. 源站 IP:源站 IP 需要根据「域名管理」配置的源站、源站组、负载均衡以及规则引擎「修改源站」的配置综合确定;
2. 回源协议:回源协议需要根据「域名管理」、规则引擎「回源 HTTPS」以及「修改源站」里的回源协议综合确定。
3. 回源端口:若无特殊配置,则为 80443,若您在规则引擎「修改源站」操作中有修改回源端口,则以修改后的为准。
4. 回源 HOST: 默认跟随加速域名,若您在规则引擎「Host Header 重写」操作中有进行设置,则以设置的为准。
5. 回源 Path:默认跟随请求 URL,若您在规则引擎「回源 URL 重写」操作中有进行修改,则以修改的为准。

步骤二:源站自身服务异常排查

使用命令行工具 curl,从第三方平台指向源站发起 HTTP/HTTPS 请求,测试方式为:
curl -vo/dev/null [协议]://[域名][path] --resolv [域名]:[端口]:[源ip]
注:CURL 版本保证在 7.21.3 版本以上。
假设回源使用 HTTP 协议、80 端口、源站 ip为 1.1.1.1、回源 HOST 为 www.test.com、URL Path 为/test.jpg,测试命令如下:
curl -vo/dev/null http://www.test.com/test.jpg --resolv www.test.com:80:1.1.1.1
从第三方客户端访问源站,如果源站返回空响应,则可能源站服务有问题,可自查源站服务是否有问题。如果源站返回正常或自查源站服务正常,则进入下一步继续排查。

步骤三:源站安全策略导致排查

可能的原因如下:
1. 源站有设置防火墙,EdgeOne 回源节点 IP 不在 IP 白名单里。
在源站上抓包或日志确认 EdgeOne 回源节点 IP 是否在源站 IP 白名单里,或者 CURL 获取 EO-LOG-UUID,提交给腾讯云技术支持,由技术支持查询 EdgeOne 回源节点的 IP,源站自查回源节点 IP 是否在源站的 IP 白名单里。其中,UUID 获取方法如下:

2. 源站设置访问限频,EdgeOne 回源频率过高。
可指向源站并发发起多个请求,验证能否复现源站返回空响应或超时的情况。如果可复现,通过源站日志排查频繁回源的请求(包含时间点、EdgeOne 回源节点 IP、URL),并将信息反馈给腾讯云技术支持排查。
3. EdgeOne 回源携带的标准头部触发源站安全策略。
EdgeOne 回源默认会携带 特定的 HTTP 请求头,可以通过 CURL 指向源站的同时携带这几个头部验证,测试方式如下:
curl -vo/dev/null [协议]://[域名][path] --resolv [域名]:[端口]:[源ip] -H "[头部名称]:[头部值]"

步骤四:运营商劫持限制

若以上排查均是正常的,且域名回源协议为 HTTP,则有可能是被运营商劫持或限制,需要在源站上抓包确认请求是否有正常回源,排查方法如下:
找一个现网无访问或访问频率较低的 URL,经由 EdgeOne 节点发起请求,同时在源站上抓包,如果源站上未收到该 HTTP 请求,则说明是被运营商劫持或限制,可直接找运营商反馈或保留现象通过腾讯云技术支持反馈给运营商。
客户端测试命令:
curl -vo/dev/null [协议]://[域名][path] --resolv [域名]:[端口]:[cdn ip]
源站测试命令:
tcpflow -cp port 80 -i [网卡] > src_80.flow
注:由于回源是 HTTP 协议,因此请求信息会以明文的形式保存在 src_80.flow 里,可通过 vi 或 vim 编辑器打开查找是否有客户端请求的 URL。