幾乎每一篇用於優化網站速度的文章或工具都有一個溫和的條款「使用 CDN」。 通俗地講,CDN是內容傳遞網路或內容傳遞網路。 Method Lab 經常會遇到客戶關於此主題的問題;其中一些客戶啟用了自己的 CDN。 本文的目的是了解 CDN 在網站載入速度方面可以提供什麼、可能會出現什麼問題以及在哪些情況下使用 CDN 是合理的。
歷史上的位
與許多技術一樣,CDN 的出現也是出於需求。 隨著網友網路通路的發展,出現了線上視訊服務。 當然,與常規網站內容(圖片、文字和 CSS 或 JS 程式碼)相比,影片內容需要更多數量級的頻寬。
當嘗試從一台伺服器向多個用戶端並行廣播視訊串流時,該伺服器的 Internet 通道很可能會成為瓶頸。 通常,幾千個執行緒就足以堵塞典型的伺服器通道。 當然,可能還有其他資源限制,但目前這些都不重要。 同樣重要的是,擴展伺服器通路成本太高(有時是不可能的),而且也不切實際。 廣播期間頻道上的負載將是週期性的。
CDN完美解決了單一伺服器的通道限制問題。 客戶端不直接連接到伺服器,而是連接到 CDN 網路中的節點。 在理想情況下,伺服器將一個流傳送到 CDN 節點,然後網路使用自己的資源將該流傳送給許多使用者。 從經濟角度來看,我們只需為實際消耗的資源(可能是頻寬或流量)付費,並獲得服務的出色可擴展性。 使用 CDN 來傳送大量內容是完全合理且合乎邏輯的。 儘管值得注意的是,該領域最大的參與者(例如 Netflix)正在建立自己的 CDN,而不是使用大型商業 CDN(Akamai、Cloudflare、Fastly 等)
隨著網路的發展,網路應用程式本身也變得越來越複雜。 加載速度的問題就凸顯出來了。 網站速度愛好者很快就發現了導致網站加載緩慢的幾個主要問題。 其中之一是網路延遲(RTT - 往返時間或 ping 時間)。 延遲會影響網站載入的許多過程:建立 TCP 連線、啟動 TLS 會話、載入每個單獨的資源(映像、JS 檔案、HTML 文件等)
當使用HTTP/1.1 協定時(在SPDY、QUIC 和HTTP/2 出現之前,這是唯一的選擇),瀏覽器對一台主機開啟的TCP 連線不超過6 個,這一事實使問題變得更加嚴重。 所有這些都導致連接停機和通道頻寬的低效率使用。 這個問題透過域分片得到了部分解決——創建額外的主機來克服連接數量的限制。
這就是 CDN 的第二個能力出現的地方——減少由於點數量多且節點距離用戶較近而導致的延遲 (RTT)。 距離在這裡起著決定性的作用:光速是有限的(光纖中約為200公里/秒)。 這意味著每行駛 000 公里就會增加 1000 毫秒的延遲或 RTT 增加 5 毫秒。 這是傳輸所需的最短時間,因為中間設備也存在延遲。 由於 CDN 通常知道如何在其伺服器上快取對象,因此我們可以從透過 CDN 載入此類對像中受益。 其必要條件是:快取中存在物件、與 Web 應用程式伺服器(來源伺服器)相比,CDN 指向使用者的距離較近。 重要的是要了解 CDN 節點的地理鄰近性並不能保證低延遲。 客戶端和 CDN 之間的路由可以這樣構建,即客戶端將連接到另一個國家/地區(甚至可能位於另一個大陸)的主機。 這就是電信業者和 CDN 服務之間的關係(對等、連接、參與 IX 等)以及 CDN 本身的流量路由策略發揮作用的地方。 例如,Cloudflare 在使用兩個初始計劃(免費和便宜)時,不保證從最近的主機交付內容 - 將選擇主機以實現最低成本。
許多領先的網路公司吸引了公眾(網頁開發人員和服務所有者)對載入速度和網站效能主題的興趣。 這些公司包括雅虎(Yslow 工具)、AOL(WebPageTest)和 Google(Page Speed Insights 服務),它們正在製定自己的網站加速建議(主要與客戶端優化有關)。 後來,出現了新的網站速度測試工具,其中也提供了提高網站速度的技巧。 這些服務或外掛程式都有一個一致的建議:「使用 CDN」。 網路延遲的減少通常被用來解釋 CDN 的效果。 不幸的是,並不是每個人都準備好準確地理解 CDN 的加速效果是如何實現的以及如何衡量它,因此該建議是出於信念並用作假設。 事實上,並非所有 CDN 都是一樣的。
立即使用 CDN
為了評估使用 CDN 的有用性,需要對它們進行分類。 現在在實務上可以發現什麼(當然,括號中的範例並不詳盡):
- 用於分發 JS 庫的免費 CDN(MaxCDN、Google.Yandex)。
- 用於客戶端優化的服務 CDN(例如,用於字體的 Google Fonts、用於圖像的 Cloudinary、Cloudimage)。
- 用於 CMS 中的靜態和資源最佳化的 CDN(可在 Bitrix、WordPress 等中使用)。
- 通用 CDN(StackPath、CDNVideo、NGENIX、Megafon)。
- 用於網站加速的 CDN(Cloudflare、Imperva、Airi)。
這些類型之間的主要區別在於有多少流量通過 CDN。 類型 1-3 只傳送部分內容:從一個請求到數十個請求(通常是圖片)。 類型 4 和 5 是透過 CDN 完全代理流量。
實際上,這意味著用於載入網站的連線數。 對於 HTTP/2,我們使用與主機的單一 TCP 連線來處理任意數量的請求。 如果我們將資源劃分為主主機(來源)和CDN,那麼就需要跨多個網域分發請求並建立多個TCP連線。 最糟的情況是:DNS (1 RTT) + TCP (1 RTT) + TLS (2-3 RTT) = 6-7 RTT。 此公式不考慮行動網路中啟動設備無線電通道(如果未啟動)的延遲以及手機訊號塔上的延遲。
以下是網站載入瀑布圖的樣子(連接 CDN 的延遲以 RTT 150 毫秒突出顯示):
如果CDN覆蓋了所有站點流量(第三方服務除外),那麼我們可以使用單一TCP連接,從而節省連接到其他主機的延遲。 當然,這適用於 HTTP/2 連線。
進一步的差異取決於特定 CDN 的功能 - 對於第一種類型,它僅託管靜態文件,對於第五種類型,它會出於優化的目的更改幾種類型的網站內容。
CDN 網站加速能力
讓我們描述用於加速站點的全方位 CDN 功能,而不考慮各個類型 CDN 的功能,然後看看每種 CDN 中實現了什麼。
1.文本資源的壓縮
這是最基本、最容易理解的功能,但往往實施得不好。 所有 CDN 都聲明壓縮作為其加速功能。 但如果你仔細觀察,缺點就會變得很明顯:
- 可以使用動態壓縮的低度數 - 5-6(例如,對於 gzip,最大值為 9);
- 靜態壓縮(快取中的檔案)不使用附加功能(例如,等級為 11 的 zopfi 或 brotli)
- 不支援高效的 brotli 壓縮(與 gzip 相比節省約 20%)。
如果您使用 CDN,則值得檢查以下幾點:獲取來自 CDN 的文件,記錄其壓縮大小並手動壓縮以進行比較(您可以使用一些支援 brotli 的線上服務,例如
2.設定客戶端快取頭
還有一個簡單的加速功能:新增客戶端(瀏覽器)內容快取的標頭。 最新的標頭是cache-control,過時的標頭是expires。 此外,還可以使用 Etag。 最主要的是cache-control的max-age足夠大(一個月或更長時間),如果你準備盡可能地快取資源,你可以添加immutable選項。
CDN 可以降低 max-age 值,迫使使用者更頻繁地重新載入靜態內容。 目前尚不清楚這與什麼有關:希望增加網路流量或增加與不知道如何重置快取的網站的兼容性。 例如,預設的 Cloudflare 標頭快取時間為 1 小時,這對於不可變的靜態資料來說非常低。
3.影像優化
由於CDN承擔了快取和服務圖片的功能,因此在CDN側進行最佳化並以這種形式將其服務給使用者是合乎邏輯的。 我們馬上預約一下,該功能僅適用於 CDN 類型 2、3 和 5。
您可以透過多種方式優化影像:使用進階壓縮格式(例如 WebP)、更有效率的編碼器 (MozJPEG),或只是清理不必要的元資料。
一般來說,此類最佳化有兩種類型:有品質損失和無品質損失。 CDN 通常會努力使用無損優化,以避免客戶對影像品質變化可能發生的投訴。 在這種情況下,收益將是最小的。 實際上,JPEG 品質等級通常比必要的要高得多,您可以安全地以較低的品質等級重新壓縮,而不會影響使用者體驗。 另一方面,很難確定所有可能的 Web 應用程式的品質等級和設置,因此與考慮上下文(影像的目的、Web 應用程式的類型)而應用的設定相比,CDN 使用更保守的設置, ETC。 )
4. 優化TLS連接
如今,大多數流量都透過 TLS 連線傳輸,這意味著我們需要花費額外的時間進行 TLS 協商。 最近,新技術的開發加速了這個過程。 例如,這是EC加密、TLS 1.3、會話快取和票證、硬體加密加速(AES-NI)等。正確設定TLS可以將連線時間減少到0-1 RTT(不包括DNS和TCP)。
借助現代軟體,您自己實現此類實踐並不困難。
並非所有 CDN 都實作 TLS 最佳實務;您可以透過測量 TLS 連線時間來檢查這一點(例如,在 Webpagetest 中)。 非常適合新連接 - 1RTT、2RTT - 平均水平,3RTT 等 - 差。
還應該注意的是,即使在 CDN 層級使用 TLS,具有我們 Web 應用程式的伺服器也必須處理 TLS,但是是從 CDN 端處理,因為伺服器和 CDN 之間的流量通過公共網路。 在最壞的情況下,我們將得到雙倍 TLS 連線延遲(第一個延遲到 CDN 主機,第二個延遲在 CDN 主機和我們的伺服器之間)。
對於某些應用程序,值得關注安全問題:流量通常在 CDN 節點上解密,這是流量攔截的潛在機會。 頂級資費計劃中通常提供不披露流量的工作選項,但需支付額外費用。
5. 減少連線延遲
大家都在談論的 CDN 的主要好處是:CDN 主機和使用者之間的低延遲(更短的距離)。 透過建立地理分散式網路架構來實現,其中主機位於用戶集中點(城市、流量交換點等)
實際上,不同網路的優先順序可能位於特定區域。 例如,俄羅斯 CDN 將在俄羅斯擁有更多存在點。 美國公司首先會在美國發展網絡。 例如,最大的CDN之一Cloudflare在俄羅斯只有2個點——莫斯科和聖彼得堡。 也就是說,與直接放置在莫斯科相比,我們最多可以節省約10毫秒的延遲。
大多數西方 CDN 在俄羅斯根本沒有站點。 透過連接到他們,您只會增加俄羅斯觀眾的延遲。
6.內容優化(縮小、結構變化)
最複雜、技術最先進的一點。 在交付過程中更改內容可能非常危險。 即使我們進行縮小:減少原始程式碼(由於額外的空格、不重要的結構等)也會影響其效能。 如果我們談論更嚴重的變更 - 將 JS 程式碼移至 HTML 末端、合併文件等 - 破壞網站功能的風險甚至更高。
因此,只有某些類型 5 CDN 會這樣做。 當然,不可能自動執行加快速度所需的所有更改,需要手動分析和最佳化。 例如,刪除未使用或重複的程式碼是一項手動任務。
通常,所有此類最佳化均由設定控制,並且預設會停用最危險的最佳化。
支援CDN類型的加速能力
那麼讓我們來看看不同類型的 CDN 提供了哪些潛在的加速機會。
為了方便起見,我們重複分類。
- 用於分發 JS 庫的免費 CDN(MaxCDN、Google.Yandex)。
- 用於客戶端優化的服務 CDN(例如,用於字體的 Google Fonts、用於圖像的 Cloudinary、Cloudimage)。
- 用於 CMS 中的靜態和資源最佳化的 CDN(可在 Bitrix、WordPress 等中使用)。
- 通用 CDN(StackPath、CDNVideo、NGENIX、Megafon)。
- 用於網站加速的 CDN(Cloudflare、Imperva、Airi)。
現在我們來比較一下CDN的特徵和類型。
機會
1型
2型
3型
4型
5型
文字壓縮
+–
-
+–
+–
+
快取標頭
+
+
+
+
+
圖片
-
+–
+–
-
+
TLS
-
-
-
+–
+
延誤
-
-
-
+
+
內容
-
-
-
-
+
本表中,「+」表示完全支持,「-」表示不支持,「+-」表示部分支持。 當然,現實中可能與此表存在偏差(例如,某些通用 CDN 會實現優化圖像的功能),但對於一般想法來說它是有用的。
結果
希望在閱讀本文後您能夠更清楚地了解「使用 CDN」建議來加速您的網站。
與任何行業一樣,您不能相信任何服務的營銷承諾。 效果需要在真實條件下測量和測試。 如果您已經在使用 CDN,請使用本文中所述的標準檢查其有效性。
現在使用 CDN 可能會減慢網站的載入時間。
作為一般建議,我們可以專注於以下內容:研究您的受眾,確定其地理範圍。 如果您的主要受眾集中在 1-2 公里的半徑內,則不需要 CDN 來實現其主要目的 - 減少延遲。 相反,您可以將伺服器放置在更靠近用戶的位置並正確配置它,從而獲得本文中描述的大部分優化(免費且永久)。
如果您的受眾確實分佈在不同的地理位置(半徑超過 3000 公里),那麼使用優質 CDN 確實會很有用。 但是,您需要提前了解您的 CDN 到底可以加速什麼(請參閱功能表及其描述)。 然而,網站加速仍然是一項複雜的任務,無法透過連接 CDN 來解決。 除了上述優化之外,CDN背後最有效的加速手段是:伺服器部分的優化、客戶端部分的高級更改(刪除未使用的程式碼、優化渲染過程、處理內容、字體、適應性等)。 )
來源: www.habr.com