1.為什麼使用cdn?
首先,cdn可以理解為乙個普通快取,如**快取或者說邊緣快取,即便不關心使用者的具體地理位置,也應該考慮使用cdn的**快取來提高使用者體驗。
簡單而言,**快取會快取你**的一些頁面,通過快取來傳輸靜態內容非常的快。
乙個簡單的例子:
假設你有乙個帶有開始頁面的部落格,這裡面列出了所有近期的部落格列表。完成這一過程,php 指令碼要從資料庫中獲取到最近的文章實體,並且將它們轉換成 html 結果頁並返回給使用者。
因此,對於一次請求或者訪問包含了:一次php執行+一組資料庫的查詢,對於1000次請求揮著訪問就包含了:1000次php執行+1000組資料庫的查詢,每一次php執行都要進行cpu,記憶體和
i/o操作,對於資料庫也是一樣的。
當cpu 和記憶體訪問到達極限的時候,訪問就會出現問題,速度會開始變得非常的慢,甚至出現不能訪問的情況,即便可以利用硬體來突破這一瓶頸,但是其工程會變得非常複雜,所以這時就會需要在中間加一層**快取,來減少資源對你的限制。
拿前面的例子來講,使用**快取只有第一次請求需要執行 php 指令碼、查詢資料庫和生成 html 結果頁。所有後面過來的請求都會從這個快取中取內容,讀取快取幾乎和直接讀取記憶體一樣快。這意味著,上面的線性規模瓶頸的問題解決了!100 個使用者或者1000 個使用者都沒關係,依然只有 1 次 php 執行、1 次資料庫查詢和 1 次的結果頁生成。
2.cdn如何起作用?
實際上cdn的型別也有所不同,起分為『pull cdn』和『push cdn』兩種,顧名思義,『push cdn』表示你要給cdn提供相應的內容,但是『pull cdn』則表示如何從cdn中取內容。
* pull cdn如何起作用的呢?*
我們來做個例子,假設你有乙個可訪問的**,url 是 在這樣的場景下,網域名稱fooer.com 會被放到 pull cdn 伺服器中,而不是你的**伺服器中。cdn 作為你**伺服器的乙個**。
還有乙個不被公開的網域名稱指向實際的**伺服器。在這個例子中假設它是 direct.fooer.com,實際**伺服器叫做源。
這個 cdn 將會接受所有的請求。如果它的快取中有結果的話將會直接返回給使用者,否則會將這個請求託管給你實際的**伺服器,然後把返回的結果快取起來為以後的請求做儲備,同時將結果返回給使用者。
最簡單的pull cdn的執行過程如下:
獲取乙個頁面的請求,例如這個頁面就是fooer.com/some/page
把some/page當作快取key檢查快取中是否存在
在快取中則直接從快取中直接返回結果給使用者
不在快取中則請求把返回的結果以/some/page作為key寫入快取,並返回給使用者
3.快取頭
絕大多數的 pull cdn 採用以「每頁」快取形式解決動態內容的問題。為了達到這樣的效果,乙個簡單的方法是 htpp 響應快取頭。
關於http快取頭,新版最常見的就是 etag 和 cache-control 這兩個標籤,但是舊版還支援expires,pragma 和 age等多個便簽,不過這些都是作為向後相容來使用的。
etag:
etag:它是文件版本的識別符號。通常是內容的 md5 值,不過它也可以包含其他內容,代表的是文件的版本/日期,如: 1.0 或者 2017-10-30。這裡注意一點是,它必須用雙引號括起來,如:etag: 「d3b0756geyg42sd3edec49eaa6238ad5ff00」。
二次驗證:
etag 的實際應用:二次驗證。我們暫時不考慮前面**+源的架構模式,只考慮簡單的客戶端-伺服器模式。
假設客戶端請求了 接著服務端返回如下的內容:
在響應裡面,有兩個有意思的頭標識:乙個是 etag,內容的 md5值,乙個是 last-modified,這是 hello.txt 檔案最後一次被修改的時間。
這裡就是二次驗證起作用的地方:當客戶端在很短的時間內再次訪問上面的 url,客戶端瀏覽器會使用 if-* 請求頭。如 if-none-match 檢查 etag 的內容是否有改變。也就是說,如果 etag 發生變化,客戶端接收到的乙個完整的新響應;如果 etag 沒變化,客戶端接收到的是乙個表明內容沒變化的標識。
如果 etag 沒有改變,那麼服務端將會返回:
正如上面所展示的,這次伺服器的響應裡面不是 200 ok,而是304 not modified,這就是說它略過包體部分,讓客戶端直接去自己的快取裡拿資料。在這個例子中,包體內容是 the body,比較小,效果不明顯。可是想象一下如果是很大的內容呢,或者是很複雜的動態生成內容呢,價值就很大了。
我們都知道,你最想快取起來的是內容,生成內容的代價是最大的,所以 etag 頭是更好的選擇。
cache-control頭
cache-control 既可以用於請求頭,也可以用於響應頭,其次它控制著兩個快取:本地快取(私有快取)和共享快取。
本地快取:是指在客戶端本地機器中的快取。它並不完全受你的控制,通常瀏覽器會自己決定是否把某些內容放到快取中,這意味著:不要依賴於本地快取。使用者也可能在關閉瀏覽器的時候清理所有快取,而你並不知道有這樣的操作。
共享快取(cdn):處於客戶端和伺服器之間的快取,即cdn。
cache-control 有幾種屬性:
private:表示它只應該存在本地快取
public:表示它既可以存在共享快取,也可以被存在本地快取
no-cache:表示不論是本地快取還是共享快取,在使用它以前必須用快取裡的值來重新驗證
no-store:表示不允許被快取。
max-age=:設定快取時間,設定單位為秒。本地快取和共享快取都可以
s-maxage=:覆蓋 max-age 屬性。只在共享快取中起作用。
immutable:表示文件是不能更改的。
must-revalidate:表示客戶端(瀏覽器)必須檢查**伺服器上是否存在,即使它已經本地快取了也要檢查。
proxy-revalidata:表示共享快取(cdn)必須要檢查源是否存在,即使已經有快取。
示例如下:
cache-control: public max-age=3600 //本地快取和 cdn 快取均快取 1 小時;
cache-control: private immutable
//不能快取在 cdn,只能快取在本地。並且一旦被快取了,則不能被更新;
cache-control: no-cache //不能快取。如果一定要快取的話,確保對其進行了二次驗證;
cache-control: public max-age=3600 s-maxage=7200
//本地快取 1 小時,cdn 上快取 2 小時;
cache-control: public max-age=3600 proxy-revalidate
//本地和 cdn 均快取 1 小時。但是如果 cdn 收到請求,則儘管已經快取了 1 小時,還是要檢查源中文件是否已經被改變。
CDN快取小結
首先,cdn可以理解為乙個普通快取,如 快取或者說邊緣快取,即便不關心使用者的具體地理位置,也應該考慮使用cdn的 快取來提高使用者體驗。簡單而言,快取會快取你 的一些頁面,通過快取來傳輸靜態內容非常的快。乙個簡單的例子 假設你有乙個帶有開始頁面的部落格,這裡面列出了所有近期的部落格列表。完成這一過...
快取之CDN快取
對於一些使用者訪問量巨大的 而言,如果所有使用者都去伺服器請求資料,伺服器會很快崩潰,並且在不同網路以及不同地區的使用者,請求伺服器的速度也不一樣。為了提高這部分使用者的訪問速度,cdn 中又提出了新的網路架構,即建立一些最接近使用者網路的邊緣伺服器,然後將檔案快取在這些邊緣伺服器 節點 上,這就是...
cdn 快取現象
如圖所示,我在阿里雲物件儲存oss系統中相應的路徑上傳了截圖中的檔案內容,過了一會兒發現這個monaco editor原始碼檔案,不能直接使用,能直接使用的是另外乙個打包過的檔案,內容為 在阿里雲物件儲存系統中刪除舊的檔案內容以後,上傳新的檔案內容,在瀏覽器中通過 網域名稱訪問這個路徑的檔案,發現檔...