開發與維運

CDN – 訪問出現 503 排查

作者:張醫博

場景

用戶在阿里雲做 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),以及大致的錯誤時間點;

Leave a Reply

Your email address will not be published. Required fields are marked *