场景
用户在阿里云做 CDN 加速后,加载 URL 时返回 503 状态码;
curl -I http://z2.alx.yas.com/uploads/basedata/images/1fcb73c76821610a6d265af01a10f045.png
HTTP/1.1 503 Service Temporarily Unavailable
Server: Tengine
Content-Length: 0
Connection: keep-alive
Via: cache29.l2cn1828[0,503-256,M], cache7.l2cn1828[10002,0], vcache5.cn627[10025,503-1281,M], vcache5.cn627[10022,10026,0]
X-Swift-Error: forward no peer valid
Age: 0
Ali-Swift-Global-Savetime: 1566887228
X-Cache: MISS TCP_MISS dirn:-2:-2
X-Swift-SaveTime: Tue, 27 Aug 2019 06:27:08 GMT
X-Swift-CacheTime: 1
X-Swift-Error: orig response 5xx error
Timing-Allow-Origin: *
EagleId: 7909f64515668872085932615e
问题排查
第一、客户端可以用 curl、wget 或者浏览器测试,将返回 503 时的 http 响应头保留下来;
curl -I http://z2.alx.yas.com/uploads/basedata/images/1fcb73c76821610a6d265af01a10f045.png --resolve basedata.azoyacdn.com:80:121.9.46.110
HTTP/1.1 503 Service Temporarily Unavailable
Server: Tengine
Content-Length: 0
Connection: keep-alive
Via: cache29.l2cn1828[0,503-256,M], cache7.l2cn1828[10002,0], vcache5.cn627[10025,503-1281,M], vcache5.cn627[10022,10026,0]
X-Swift-Error: forward no peer valid
Age: 0
Ali-Swift-Global-Savetime: 1566887228
X-Cache: MISS TCP_MISS dirn:-2:-2
X-Swift-SaveTime: Tue, 27 Aug 2019 06:27:08 GMT
X-Swift-CacheTime: 1
X-Swift-Error: orig response 5xx error
Timing-Allow-Origin: *
EagleId: 7909f64515668872085932615e
从 CDN 返回的 503 http 响应头可以看到几个重要信息:
1) X-Swift-Error: orig response 5xx error
- 通过 X-Swift-Error 返回的信息,可以初步判断 503 是因为 CDN 回源后响应的 503;
2) http 返回的 Via 头
- Via 头含义,从右到左依次是 L1 节点回源字段,
vcache5.cn627[10025,503-1281,M], vcache5.cn627[10022,10026,0]
,L2 节点的回源字段cache29.l2cn1828[0,503-256,M], cache7.l2cn1828[10002,0]
- 在 L2 的字段段看到 [] 内的 10002 就是回源的超时时间,综合判断可知是因为 L2 回源后,超时未得到原站的响应(比如读、写超时)导致的 503;
第二、固定原站做七层测试
Linux 测试
原站是 80 端口
curl -vo /dev/null "http://z2.alx.yas.com/" -x 原站IP:原站端口
原站是 443 端口
curl -vo /dev/null "http://z2.alx.yas.com/" --resolve "z2.alx.yas.com:原站IP:原站端口"
Windows 测试
1)先编辑: C:\Windows\System32\drivers\etc\hosts
2)在 hosts 中配置原站 IP: 原站IP z2.alx.yas.com
3)浏览器发起 http/https 请求,如果原站 http 端口不是 80 ,浏览器访问时需要在域名后手动加上原站的自定义端口 http://z2.alx.yas.com:8080
第三、测试原站四层的端口,看响应时间是否正常
time telnet 原站IP 原站端口
,如果发现四层的端口响应很慢,侧面说明原站七层的应用负载较高,或者服务器负载异常,需要原站自查;
第四、对原站做网络测试
ping 原站IP -c 50 -s 1460 -i 0.1
mtr -n 原站IP
通过以上两个网络测试命令,看下普通的客户端到原站的延迟是否稳定,丢包率是否异常,如果普通的客户端测试到原站延迟、丢包都有异常,那 CDN 回源可能也有问题,发现原站如果网络异常,需要客户先自查下;
第五、以上四点测试均正常,需要 CDN 测进行日志分析,请提交工单到阿里云;
提供如下信息:
- 1)加载 503 的 URL ,最好能提供报错的完整响应头;
- 2)客户端 ping 下 CDN 域名看目标的 CDN ;
- 3)大面积的 503 ,还是个别客户加载 503 ,大面积的问题存在共性;
- 4)客户端的 IP(获取工具 https://cdn.dns-detect.alicdn.com/https/doc.html),以及大致的错误时间点;