一、什么是CDN ?
內容分發網絡(CDN)是指一組分布在不同地理位置的服務器,協同工作以提供互聯網內容的快速交付。
CDN 允許快速傳輸加載互聯網內容所需的資源,包括 HTML 頁面、javascript 文件、樣式表、圖像和視頻。 CDN 服務已得到不斷普及。如今,大多數 web 流量都通過 CDN 提供服務,包括來自Facebook、Netflix 和亞馬遜等主要網站的流量。
正確配置的 CDN 還可幫助保護網站免受某些常見的惡意攻擊,例如分布式拒絕服務(DDOS)攻擊。
1.1 使用CDN 有什么好處
盡管使用 CDN 的好處取決於互聯網資產的大小和需求,但對於大多數用戶而言,主要好處可以分為以下四個不同的部分:
- 縮短網站加載時間 – 通過將內容分發到訪問者附近的 CDN 服務器(以及其他優化措施),訪問者體驗到更快的頁面加載時間。由於訪問者更傾向於離開加載緩慢的網站,CDN 可以降低跳出率並增加人們在該網站上停留的時間。換句話說,網站速度越快,用戶停留的時間越長。
- 減少帶寬成本 – 網站托管的帶寬消耗成本是網站的主要費用。通過緩存和其他優化,CDN 能夠減少源服務器必須提供的數據量,從而降低網站所有者的托管成本。
- 增加內容可用性和冗余 – 大流量或硬件故障可能會擾亂正常的網站功能。由於 CDN 具有分布式特性,因此與許多源服務器相比,CDN 可以處理更多流量並更好地承受硬件故障。
- 改善網站安全性 – CDN 可以通過提供 DDoS 緩解、安全證書的改進以及其他優化措施來提高安全性。
1.2 CDN 如何工作
CDN 的核心是一個服務器網絡,目的是盡可能快速、便宜、可靠和安全地交付內容。為了提高速度和連接性,CDN 會將服務器放置在不同網絡之間的交換點。
這些互聯網交換點(IXP)是不同互聯網提供商連接的主要位置,以便彼此提供對來自其不同網絡的流量的訪問。通過連接到這些高速且高度互連的位置,CDN 提供商可以減少高速數據傳輸中的成本和傳輸時間。
除了在 IXP 中放置服務器,CDN 還對標准客戶端/服務器數據傳輸進行了諸多優化。 CDN 將數據中心放置在全球的戰略位置,增強安全性,並設計成可承受各種類型的故障和互聯網擁塞。
互聯網交換點(IXP)是互聯網基礎設施公司(如互聯網服務提供商(ISP)和CDN)相互連接的物理位置。這些位置位於不同網絡的“邊緣”,允許網絡提供商在其網絡之外共享傳輸。
通過在IXP位置內的存在,公司能夠縮短從其他參與網絡到中轉站的路徑,從而減少延遲,改善往返時間,並可能降低成本。
解析: IXP 也就是CDN 運營商在不同地理位置的網絡,接入不同運營商線路的服務節點
1.3 延遲 – CDN 如何改善網站加載時間?
在網站加載內容方面,隨着網站速度變慢,用戶數量會迅速減少。 CDN 服務可以通過以下方式幫助減少加載時間:
- CDN 的全球分布性可縮短用戶與網站資源之間的距離。CDN 使得用戶不必連接到網站源服務器的所在地,而是連接到一個地理位置更近的數據中心。更少的傳輸時間意味着更快的服務。
- 硬件和軟件優化,例如有效的負載均衡和固態硬盤驅動器,可以幫助數據更快地到達用戶。
- CDN 可以使用最小化和文件壓縮之類的策略來減小文件大小,從而減少傳輸的數據量。較小的文件意味着更快的加載時間。
- CDN 還可以通過優化連接重用和啟用 TLS 假啟動來加速使用 TLS/SSL 的站點。
CDN 的一大優勢是它能夠快速、高效地交付內容。CDN 性能優化可分為三個類別。 縮短距離:縮短客戶端與所請求數據之間的物理距離 優化硬件/軟件:提高服務器端基礎結構的性能,例如通過使用固態硬盤驅動器和高效負載均衡 減少數據傳輸:采用各種技術來減小文件大小,以便快速進行初始頁面加載
二、CDN cache
緩存是內容交付網絡(CDN)服務的核心。類似於瀏覽器緩存將文件存儲在硬盤上的方式,在硬盤上可以更快地訪問文件,CDN將您的網站內容移動到功能強大的代理服務器上,這些服務器為加速內容分發而優化。
緩存的工作原理是有選擇地將網站文件存儲在CDN的緩存代理服務器上,從附近位置瀏覽的網站訪問者可以快速訪問這些文件。
大多數網站內容由靜態預格式化文件組成,這些文件預計不會隨時間(或針對不同的用戶)而更改。這些文件是緩存的默認候選文件,而動態文件是根據數據庫中的信息動態生成的。
例如:帶有動態生成的產品信息的靜態電子商店模板。典型的靜態文件包括:五種常見的資源
Template Images 模板圖像
Videos 視頻
Music 音樂
JavaScript JavaScript 腳本
CSS Files CSS文件
2.1 緩存頭部
緩存目前大多都是針對http 協議的控制,業務交互基於http 協議的交互。
緩存控制主要被分為兩方面 Cache-Control (緩存控制)和 Additional HTTP Cache Headers (附加緩存頭)
2.1.1 Cache-Control (緩存控制)
Cache-Control: Max-Age Cache-Control: No-Cache Cache-Control: No-Store Cache-Control: Public Cache-Control: Private
Cache-Control: Max-Age
max age request指令以秒為單位定義資源的緩存副本過期所需的時間量。過期后,瀏覽器必須通過向服務器發送另一個請求來刷新其資源版本。
例如,cache control:max age=120表示返回的資源有效期為120秒,之后瀏覽器必須請求更新的版本。
Cache-Control: No-Cache
no cache指令意味着瀏覽器可以緩存響應,但必須首先向源服務器提交驗證請求。
Cache-Control: No-Store
no-store指令意味着不允許瀏覽器緩存響應,並且必須在每次請求響應時從服務器中提取響應。此設置通常用於敏感數據,例如個人銀行詳細信息。
Cache-Control: Public
public response指令指示任何緩存都可以緩存資源。
Cache-Control: Private
private response指令指示資源是特定於用戶的,它仍然可以緩存,但只能緩存在客戶端設備上。例如,標記為私有的網頁響應可以由桌面瀏覽器緩存,但不能由內容交付網絡(CDN)緩存。
2.1.2 Additional HTTP Cache Headers (附加緩存頭)
Expires
ETag
Vary
Expires
Expires–此標頭指定緩存資源過期的固定日期/時間。例如,Expires:Sat,2017年5月13日07:00:00 GMT表示緩存的資源將於2017年5月13日上午7:00 GMT到期。
當存在包含max age指令的緩存控制標頭時,Expires標頭將被忽略。
ETag
ETag–一個響應頭,根據標記(引號中的字符串,例如“675af34563dc-tr34”)標識服務內容的版本,該標記在資源修改后會更改。如果在發出請求之前令牌保持不變,瀏覽器將繼續使用其本地版本。
相當於文件唯一標識符
Last-Modified
The Last-Modified 是一個響應首部,其中包含源頭服務器認定的資源做出修改的日期及時間。 它通常被用作一個驗證器來判斷接收到的或者存儲的資源是否彼此一致。由於精確度比 ETag 要低,所以這是一個備用機制。
包含有 If-Modified-Since 或 If-Unmodified-Since 首部的條件請求會使用這個字段。
Vary
Vary–一個標頭,用於確定必須與緩存資源匹配才能將其視為有效的響應。例如,標頭Vary:Accept Language,User Agent指定用戶代理和語言的每個組合都必須存在緩存版本。
三、cache 實驗
3.1 瀏覽器緩存策略 Expires
在這個里面以max-age 為准,如果只有 expires ,那么時間到期重新請求
3.2 Cache-control:max-age
Expires 的方法很好,但是我們每次都得算一個精確的時間。 max-age 標簽可以讓 我們更加容易的處理過期時間。我們只需要說,這份資料你只能用一個星期就可以了。 Max-age 使用秒來計量,如: Cache-Control:max-age=645672 指定頁面 645672 秒(7.47 天)后過期。
3.3 Last-Modified
服務器為了通知瀏覽器當前文件的版本,會發送一個上次修改時間的標簽,例如:
Last-Modified:Thu, 20 Jan 2022 04:40:00 GMT
這樣瀏覽器就知道他收到的這個文件創建時間,在后續的請求中,瀏覽器會按照下面 的規則進行驗證: 1. 瀏覽器: Hey,我需要 XXXXXXXX.js 這個文件,如果是在 Tue, 20 Jan 2022 04:40:00 GMT 之后修改過的,請發給我。 2. 服務器:(檢查文件的修改時間) 3. 服務器: Hey,這個文件在那個時間之后沒有被修改過,你已經有最新的版本了。 4. 瀏覽器:太好了,那我就顯示給用戶了。 在這種情況下,服務器僅僅返回了一個 304 的響應頭,減少了響應的數據量,提高 了響應的速度。 關於 304 響應,請參考
3.4 ETag
通常情況下,通過修改時間來比較文件是可行的。但是在一些特殊情況,例如服務器
的時鍾發生了錯誤,服務器時鍾進行修改,夏時制 DST 到來后服務器時間沒有及時更新,
這些都會引起通過修改時間比較文件版本的問題。
ETag 可以用來解決這種問題。 ETag 是一個文件的唯一標志符。就像一個哈希或者
指紋,每個文件都有一個單獨的標志,只要這個文件發生了改變,這個標志就會發生變化
服務器返回 ETag 標簽:
接下來的訪問順序如下所示: 1. 瀏覽器: Hey,我需要 xxxxxxxx.js 這個文件,有沒有不匹配 "e96c15f68c6885e098749f67170b4c3b"這個串的 2. 服務器:(檢查 ETag…) 3. 服務器: Hey,我這里的版本也是"e96c15f68c6885e098749f67170b4c3b",你已經是 最新的版本了 4. 瀏覽器:好,那就可以使用本地緩存了 如同 Last-modified 一樣, ETag 解決了文件版本比較的問題。只不過 ETag 的級 別比 Last-Modified 高一些。
四、 瀏覽器緩存刷新
1. 在地址欄中輸入網址后按回車或點擊轉到按鈕
瀏覽器以最少的請求來獲取網頁的數據,瀏覽器會對所有沒有過期的內容直接使用本
地緩存,從而減少了對瀏覽器的請求。所以, Expires, max-age 標記只對這種方式有效。
2. 按 F5 或瀏覽器刷新按鈕
瀏覽器會在請求中附加必要的緩存協商,但不允許瀏覽器直接使用本地緩存,它能夠
讓 Last-Modified、 ETag 發揮效果,但是對 Expires 無效。
3. 按 Ctrl+F5 或按 Ctrl 並點擊刷新按鈕
這種方式就是強制刷新,總會發起一個全新的請求,不使用任何緩存。
3.1 CDN 緩存
瀏覽器本地緩存失效后,瀏覽器會向 CDN 邊緣節點發起請求。類似瀏覽器緩存, CDN
邊緣節點也存在着一套緩存機制。
3.2 CDN 緩存的缺點
CDN 的分流作用不僅減少了用戶的訪問延時,也減少的源站的負載。但其缺點也很
明顯:當網站更新時,如果 CDN 節點上數據沒有及時更新,即便用戶再瀏覽器使用 Ctrl
+F5 的方式使瀏覽器端的緩存失效,也會因為 CDN 邊緣節點沒有同步最新數據而導致用
戶訪問異常。
3.3 CDN 緩存策略
CDN 邊緣節點緩存策略因服務商不同而不同,但一般都會遵循 http 標准協議,通過
http 響應頭中的 Cache-control: max-age 的字段來設置 CDN 邊緣節點數據緩存時間。
當客戶端向 CDN 節點請求數據時, CDN 節點會判斷緩存數據是否過期,若緩存數
據並沒有過期,則直接將緩存數據返回給客戶端;否則, CDN 節點就會向源站發出回源
請求,從源站拉取最新數據,更新本地緩存,並將最新數據返回給客戶端。
CDN 服務商一般會提供基於文件后綴、目錄多個維度來指定 CDN 緩存時間,為用
戶提供更精細化的緩存管理。
CDN 緩存時間會對“回源率” 產生直接的影響。若 CDN 緩存時間較短, CDN 邊緣
節點上的數據會經常失效,導致頻繁回源,增加了源站的負載,同時也增大的訪問延時;
若 CDN 緩存時間太長,會帶來數據更新時間慢的問題。開發者需要增對特定的業務,來
做特定的數據緩存時間管理。
3.4 CDN 緩存刷新
CDN 邊緣節點對開發者是透明的,相比於瀏覽器 Ctrl+F5 的強制刷新來使瀏覽器本
地緩存失效,開發者可以通過 CDN 服務商提供的“刷新緩存” 接口來達到清理 CDN 邊
緣節點緩存的目的。這樣開發者在更新數據后,可以使用“刷新緩存” 功能來強制 CDN
節點上的數據緩存過期,保證客戶端在訪問時,拉取到最新的數據。