問題分析
通過阿里雲CDN訪問出現5xx錯誤,在響應的Response Header裡的X-Swift-Error字段會有相關的錯誤,例如forward retry timeout或者orig response 5xx error,同時用curl測試或者瀏覽器Network開發者模式下可以看這個請求消耗的時間。
遇到這類問題可以初步分析,如果是全局都是5xx的錯誤,通常就是CDN的配置錯誤或者源站錯誤導致的,比如“源站不通或源站域名無法解析”、“CDN配置了HTTPS回源,但源站不支持HTTPS”、“源站開啟了SNI校驗,但是CDN沒有開啟回源SNI”等,這些配置會導致CDN必然會回源失敗,響應5xx錯誤。如果只是部分區域有問題,或者問題是偶發出現的,那麼有可能跟部分地區回源網絡或其他因素有關。比如源站的安全策略把部分CDN節點IP屏蔽了,就會導致對應區域的用戶訪問CDN異常;比如源站側網絡不穩定或者回源跨境鏈路不穩定或者源站動態接口響應速度不穩定,就會有偶發出現5xx的情況。
nginx對於502/503/504的錯誤解釋如下
詳細信息
一. 源站不通或源站域名無法解析
CDN 都是公網上的節點,CDN配置的源站必須要公網可達。如果配置的源站IP公網不可達、端口不通或者源站域名沒有解析,則會導致CDN回源請求源站失敗,報錯5xx。
常見的幾種異常情況如下:
(1)源站網絡不通,測試無法ping通源站IP。ping測試命令:ping 源站IP
(2)源站端口不通或源站直接響應5xx錯誤。例如以下案例,telnet端口報錯Connection timed out
i)如果源站端口配置的是80,則測試80端口是否通:telnet 源站IP 80
ii)如果源站端口配置的是443,則測試443端口是否通。如果源站端口配置的是自定義端口,則測試自定義端口是否通。
iii)可以在CDN控制檯獲取配置的源站地址和端口,然後本地host綁定到源站,固定源站做七層測試,查看是否是源站直接無響應或源站直接響應5xx,具體可以參考這裡。
(3) 源站配置的是域名,但是源站域名未配置解析,會導致CDN請求源站失敗。可以用ping和nslookup命令檢查源站域名的解析是否正常。例如以下案例,配置源站域名www.a.com,ping www.a.com報錯unknown host,nslookup unknown host報錯server can't find www.a.com: NXDOMAIN,表示域名未解析。
二.CDN配置了HTTPS回源,但源站不支持HTTPS
(1)源站端口配置成443,但源站不支持HTTPS
在CDN控制檯的源站配置界面,如果源站端口配置成443,則CDN回源的時候是HTTPS回源到源站的443端口。源站需要開放443端口,且配置HTTPS證書。如果源站不支持HTTPS訪問,則CDN回源失敗,報錯5xx。對於這種情況,可以把回源端口改成80;如果業務需要443回源的話,那麼需要在源站配置HTTPS證書。
(2)CDN配置了協議跟隨回源,但是源站不支持HTTPS訪問。
協議跟隨回源如果設置成“HTTPS”,則CDN是以HTTPS回源;協議跟隨回源如果設置成“跟隨”,則當客戶端是HTTPS訪問的時候,CDN是HTTPS回源。源站不支持HTTPS的情況下,會出現訪問失敗。對於這種情況,需要關閉協議跟隨回源功能,或設置為HTTP回源。
可以通過curl命令直接綁定到源站去測試,測試命令:curl -voa http://dc.xxx.cn --resolve dc.xxx.cn:443:a.a.a.a (dc.xxx.cn是CDN加速域名,a.a.a.a是源站IP)
也可以修改本地etc/hosts文件綁定到源站,用瀏覽器發起HTTPS訪問。以下案例報錯“您的連接不是私密連接”,則表示不支持HTTPS訪問。
三.源站開啟了SNI校驗,但是CDN沒有開啟“回源SNI”
CDN回源默認是不帶SNI信息的,如果您的源站IP綁定了多個域名,當CDN節點以HTTPS協議訪問您的源站時,由於沒有帶SNI信息,會導致源站無法正確響應HTTPS證書,導致回源失敗。因為這個問題導致的錯誤,一般是503 Service Temporarily Unavailable錯誤,而且很快就會返回這個錯誤。您可以在CDN控制檯設置開啟回源SNI,指明具體訪問域名。具體SNI的介紹以及配置方法參考這裡。
四.源站存在安全防護規則
源站的相關安全防護規則導致的CDN回源異常,通常會在10秒以內就返回5xx錯誤,大部分情況會返回503 Service Temporarily Unavailable的錯誤,具體的排查方法和解決方案可以參考文檔源站安全策略導致5xx。
(1)源站服務器開啟了安全組限制,限制了CDN節點的訪問
(2)源站服務器配置了單IP訪問次數限制,把CDN的回源IP當成了異常IP
(3)源站存在雲鎖、安全狗、防火牆等安全策略,攔截了CDN的回源IP
(4)源站Web服務異常或服務器超載
五. 源站超時無響應導致CDN回源超時
CDN 回源有嚴格的超時時間,四層 TCP 是 10 秒超時,七層HTTP / HTTPS是 30 秒超時,當超過該時間時即使後續源站響應正常也是會返回 5xx錯誤,通常因CDN回源超時導致的問題,會響應504Gateway Time-out錯誤。可以綁定源站去測試源站的響應速度,如果超過30秒,需要檢查源站服務,優化源站的響應速度,確保源站返回請求時間控制在一個較短的時間內,另外也可以申請延長CDN域名的默認超時時長,詳細請參考配置回源請求超時時間。
通常這類回源超時的問題發生在一些動態請求上,比如請求源站的程序、數據庫、接口等,源站處理需要一些時間。這類情況建議源站使用 CDN 的站點都做動靜分離改造,靜態資源用CDN加速域名,動態資源直接用源站域名,因為如果源站響應慢,部分動態資源可能出現 30 秒仍然無法響應的情況。
六. 跨境回源或源站側網絡異常
回源存在跨境鏈路導致的CDN回源超時,響應502/504錯誤。例如源站在境外,中國大陸的用戶訪問的時候,是先訪問到中國大陸的CDN節點,然後中國大陸的CDN節點走跨境鏈路,回源到境外的源站;亦或者源站在中國大陸,境外用戶訪問的時候先請求到境外的CDN節點,境外的CDN節點走跨境鏈路,回源到中國大陸的源站。由於CDN回源走的都是公網,這種情況涉及到跨境鏈路,需要走國際互聯網出口以及境外運營商的鏈路,本身就存在一定的不穩定因素。還有一種情況是源站側機房的網絡差,或源站側網絡不穩定。
通常這兩類問題CDN層面的優化難度比較大,因為CDN只是提供了節點,做緩存服務,很難去控制公網的網絡以及源站側的網絡。對於源站側網絡的問題,建議優化源站;對於跨境回源的問題,建議優化CDN的緩存命中率,儘量減少回源,降低5xx比率。或者考慮使用海外源站+國內源站的雙源站架構。
相關文檔
域名綁定Host操作
源站存在安全防護等原因導致訪問CDN域名報503錯誤
回源請求超時時間
使用CDN後訪問域名提示“504”Gateway Time-out"錯誤
適用於
CDN
DCDN