問題場景
用戶使用阿里雲CDN加速服務以後出現508錯誤。我們先來看一下,Http_code 508的定義:
The server terminated an operation because it encountered an infinite loop while processing a request with "Depth: infinity". This status indicates that the entire operation failed。
Source: RFC5842 Section 7.2
也就是說,服務器在處理請求時陷入死循環,此狀態表示整個操作失敗。
問題闡述
從上面的CDN的508錯誤裡,可以看到CDN返回的Response Headers裡,x-alicdn-da-ups-status響應了508,eagleid響應了兩個值。通常情況下,一次通過CDN加速的請求,eagleid只會記錄一個值,用於唯一標識這次請求,像這種情況,eagleid記錄了多個值,說明這個請求在CDN裡循環了。造成這個現象的可能原因一般有如下兩種情況:
- CDN的源站也是在阿里CDN上加速的,比如CDN的源站域名也是用了一個阿里CDN域名。
- CDN的源站有一些代理的邏輯,會將CDN加速域名的請求代理到另外一個走阿里CDN加速的域名上。
這裡請注意,因為數據的走向是:客戶端-->CDN-->源站。如果源站也是走了CDN的話,就會變成:客戶端-->CDN-->源站-->CDN-->源站...以此循環,這種情況就可能導致迴環的情況,出現508。CDN產品本身有限制,要求CDN的源站不能是走阿里CDN加速,這是一種非標準化的操作。
另外還有一種定位方法,可以直接綁定Host到源站去測試,也就是不通過CDN訪問,然後看返回的Response headers響應頭,是否帶有CDN的特殊header頭,一般就是看Via頭就可以了(阿里雲CDN返回的header裡會帶有Via頭),可以參考下圖。如果直接訪問源站的時候,源站返回的header頭卻有CDN特有的header頭,那就說明源站有請求CDN的邏輯。
特別注意
CDN添加域名的時候,CDN控制檯會做判斷,如果用戶填寫的源站域名是阿里CDN加速域名的話,會直接報錯。但是有兩種情況目前CDN層面還無法避免,需要用戶側去修改:
- 用戶配置加速域名A的源站域名是域名B,此時域名B未走CDN加速,因此域名A的源站可以配置成功。但是配置成功以後,用戶將域名B添加到CDN上做加速。
- 用戶配置的源站不走CDN,但是源站會做一些代理,例如方向代理,把CDN加速域名的請求代理到另外一個CDN加速域名,這種情況CDN也是無法提前監測到的。