CDN 路由包含兩個獨立決策:用戶端連線至何處,以及邊緣節點接觸哪個來源站。DNS 與 anycast 選擇邊緣位置; 該邊緣位置的設定則選擇來源站並建構上游請求。分開這些決策可使故障更容易診斷。
邊緣節點的請求身分 #
用戶端從 https://www.example.com/docs 這類 URL 開始。DNS 返回邊緣位址,TLS SNI 在握手期間識別
www.example.com,而 HTTP 請求攜帶 Host: www.example.com(或 HTTP/2 與 HTTP/3 中的等價
:authority 欄位)。CDN 使用此主機名稱與路徑選擇分發與快取行為。
單獨的 IP 位址不是來源站身分。共用反向代理會在一個位址上代管多個網域,因此直接測試必須包含預期的主機名稱:
curl --resolve www.example.com:443:203.0.113.10 \
https://www.example.com/health--resolve 會保留 URL 主機名稱供 SNI 與 HTTP 使用,同時選取特定位址。相較於使用原始 IP URL 並只手動提供
標頭,這種方式更安全且更具代表性。
轉送正確的上游 Host #
來源站可能會使用傳入的主機選取虛擬主機、產生重新導向或套用租戶原則。CDN 可以保留檢視者主機、以來源站主機名稱 取代它,或轉送已設定的值。請刻意選擇其中一種:
viewer: https://www.example.com/account
edge: GET /account Host: origin.internal.example.net
origin: routes by Host and returns a response如果來源站 TLS 憑證的名稱是 origin.internal.example.net,CDN 應使用該名稱進行上游 SNI 與憑證驗證。
來源站需要時仍可將 www.example.com 作為 HTTP Host 轉送,但不應因此削弱 TLS 驗證。
避免路由與快取意外 #
讓快取鍵、來源站選擇規則與轉送標頭保持一致。如果 /api/* 送往 API 來源站,而 /* 送往物件儲存,
請讓更具體的規則優先。只有在租戶或地區變更回應時,才將它加入快取鍵;較清楚的做法是使用不同主機名稱或行為。
保護來源站免受直接流量,記錄檢視者與上游請求 ID,並透過 CDN 測試重新導向、WebSocket、健康檢查與錯誤路徑。 能從內部網路正常運作的來源站,仍可能因 DNS、SNI、防火牆或轉送主機差異而在邊緣節點失敗。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)