問題描述
當您使用阿里雲CDN加速網站訪問資源後,用戶端的請求將首先發送到CDN的L1節點(一級節點),再回源到L2節點(二級節點),然後再回源到來源站點。因此如果訪問過程中出現問題,可能涉及到多級網路鏈路的問題。當CDN回源來源站點異常失敗時就會出現5xx的錯誤,主要包括502 Bad Gateway
、503 Service Temporarily Unavailable
、504 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)建立並覆蓋在承載網上,是由不同地區的伺服器組成的分布式網路,也是將來源站點資源緩衝到全國各地的Edge Server的網站加速產品。當您初次訪問或緩衝到期後,伺服器會透傳回到來源站點,其中來源站點的回應時間和首位元組時間對回源請求的處理非常重要。如果您的網站在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的方法如下:
登入CDN控制台。
在左側導覽列,選擇內容分發服務>監控查詢>即時監控,觀察近期頻寬和QPS指標,檢查頻寬和QPS是否有突增的情況,如有突增情況發生,可能會導致回源後造成來源站點頻寬壓力過高,從而引發來源站點響應逾時。
如果CDN透傳回源的頻寬有突增情況,則應檢查是否有新資源發布,或者檢查熱點資源是否配置了緩衝規則。如果您的遊戲類或圖片類業務較多,則建議在發布前通過CDN預熱功能將資源提前布置到CDN上,避免瞬間回源頻寬過高造成來源站點瓶頸。同時,需要針對熱點資源添加長期緩衝策略。
檢查CDN側和來源站點是否配置了緩衝規則。如果來源站點配置了no-cache回應標頭,則其優先順序高於CDN側。如果來源站點和CDN側都沒有配置緩衝規則,則預設緩衝10~3600秒,關於緩衝規則的更多資訊,請參見緩衝概述。
如果您剛接入CDN業務,對CDN業務沒有緩衝經驗,可以對目錄類型的資源配置一個最大的緩衝範圍。然後針對您不需要緩衝的資源,單獨配置一條策略,後續可通過優先順序來控制匹配順序。具體操作,請參見配置緩衝到期時間。
步驟四:來源站點不通或來源站點網域名稱無法解析的排查
CDN節點都是公網上的節點,CDN配置的來源站點必須要連通公網。如果配置的來源站點IP公網不可達、連接埠不通或者來源站點網域名稱沒有解析,則會導致CDN回源請求來源站點失敗,報錯5XX。常見的幾種異常情況如下:
來源站點網路不通,無法ping通來源站點IP。測試命令如下。
ping [$IP]
說明[$IP]為來源站點IP。
來源站點連接埠不通或來源站點直接返回5XX錯誤。如下操作所示,telnet連接埠報
Connection timed out
錯誤。如果來源站點連接埠配置的是80,則測試80連接埠是否通,命令如下。
telnet [$IP] 80
如果來源站點連接埠配置的是443,則測試443連接埠是否通。如果來源站點連接埠配置的是自訂連接埠,則測試自訂連接埠是否通。
可以在CDN控制台擷取配置的來源站點地址和連接埠,然後在本地hosts檔案中繫結來源站。您可以固定來源站點做七層測試,查看是否是來源站點無響應或來源站點直接響應5XX。也可以使用
curl
命令測試繫結來源站,測試命令如下。來源站點連接埠是80:
curl -voa http://[$Domain] -x [$IP]:80
說明[$Domain]為加速網域名稱。
來源站點連接埠是443:
curl -voa https://[$Domain] --resolve [$Domain]:443:[$IP]
來源站點配置的是網域名稱,但是來源站點網域名稱未配置解析,則會導致CDN請求來源站點失敗。可以使用
ping
和nslookup
命令檢查來源站點網域名稱的解析是否正常。例如,來源站點網域名稱為example.aliyundoc.com,ping來源站點網域名稱example.aliyundoc.com報unknown host
錯,使用nslookup網域名稱查詢來源站點網域名稱的DNS記錄報server can't find example.aliyundoc.com: NXDOMAIN
錯,都表示網域名稱未解析。如何佈建網域名解析請參見配置CNAME。
步驟五:檢查CDN回源配置
CDN配置了HTTPS回源,但來源站點不支援HTTPS也會導致訪問資源返回5xx錯誤,請根據業務參見以下操作排查:
來源站點連接埠配置成443,但來源站點不支援HTTPS。在CDN控制台的來源站點配置介面,如果來源站點連接埠配置成443,則CDN回源的時候是HTTPS回源到來源站點的443連接埠。來源站點需要開放443連接埠,且配置HTTPS認證。
如果來源站點不支援HTTPS訪問,則CDN回源失敗,報5XX錯。對於這種情況,可以把回源連接埠改成80。
如果業務需要443回源,那麼需要在來源站點配置HTTPS認證。
CDN配置了協議跟隨回源,但是來源站點不支援HTTPS訪問。協議跟隨回源如果設定成HTTPS,則CDN是以HTTPS回源。協議跟隨回源如果設定成跟隨,則當用戶端是HTTPS訪問的時候,CDN是HTTPS回源。來源站點不支援HTTPS的情況下,會出現訪問失敗。對於這種情況,需要關閉協議跟隨回源功能,或設定為HTTP回源。
可以通過
curl
命令繫結來源站進行測試,測試命令如下。curl -voa https://[$Domain] --resolve [$Domain]:443:[$IP]
系統顯示類似如下。
也可以修改本地hosts檔案綁定到來源站點,用瀏覽器發起HTTPS訪問。以下案例報錯
您的串連不是私密串連
,則表示不支援HTTPS訪問。
情境二:使用CDN+OSS的業務架構
如果您使用了CDN+OSS的業務架構,可參見以下內容排查問題:
登入Object Storage Service控制台,單擊左側導覽列的常用工具與服務,參考ossutil相關文檔,並使用ossutil命令列工具的
--probe-item
選項,檢查OSS的下行頻寬是否超過10GBps,QPS訪問是否超過10000次/秒。如果OSS超過限制規則,則會觸發OSS的流控,對超過限制的回源請求進入慢速處理。關於OSS的流控規則,請參見使用限制。說明關於如何使用ossutil命令列工具的
--probe-item
選項,請參見查看選項。慢速處理不是直接返回停用狀態,僅是對超過限制的請求處理進行降速處理。
檢查CDN回源的下行流量是否超過了來源站點的頻寬節流設定,來源站點頻寬被打滿後會導致連鎖的網路反應和應用程式層的問題。
說明檢查兩個節點間傳輸的流量可以使用iperf工具。
檢查網路連接數可以使用Netstat工具。
檢查來源站點是否有防火牆限制,即來源站點是否對回源請求做過限速或者IP限制。
若之前的排查結果均正常,可以分析來源站點Web服務的報錯日誌,檢查日誌中是否有5xx報錯資訊出現。若未在應用程式層的記錄檔中發現報錯記錄,則可以反向測試來源站點到CDN節點的鏈路,檢查是否有網路間鏈路抖動導致的5xx報錯,具體以現場實際發生的頻率和業務狀況為準。
說明一般情況下,來源站點頻寬如果容易被打滿,或者容易發生丟包或延遲的情況,則建議將Nginx的nginx.conf設定檔中的
send timeout
或者read timeout
參數調大一些。