若是你的網站的用戶遍及世界各地,並且你的網站有不少靜態資源(html, js, css, 圖片),那麼你必定會想利用 CDN(Content Delivery Network)來加快你的網站的訪問速度。關於CDN的基本原理,請看這裏。 css
這裏分析一下蘋果官網(www.apple.com)的CDN的應用(蘋果使用了Akamai做爲其CDN服務商)html
用戶的在主頁上搜索macbook的操做流程:瀏覽器
訪問蘋果主頁緩存
在輸入框輸入關鍵字"macbook",點擊search按鈕服務器
實際發生的請求:網絡
向www.apple.com發送請求,返回結果爲html頁面。app
由於html頁面包含有css引用代碼性能
<link id="globalheader-stylesheet" rel="stylesheet" href="http://images.apple.com/global/nav/styles/navigation.css" type="text/css" />
緊接着向 images.apple.com 發送請求,獲得css文件網站
當用戶點擊搜索按鈕後,向www.apple.com 發送請求 http://www.apple.com/search/?q=macbookurl
在整個過程當中涉及到二個域名:www.apple.com 和 images.apple.com
dig後發現這兩個域名都用CNAME指向了Akamai的DNS服務器
由此可知整個過程的三個請求都是發送到了Akamai CDN服務器,其中兩個是請求是靜態資源(html和css),已經緩存在了Akamai CDN裏,只要緩存沒過時,就能夠直接返回給用戶;一個是動態請求(search/?q=macbook),此時Akamai CDN搖身一變成了代理服務器,每次都把請求轉發給apple服務器,以下圖。
這裏須要指出一點,對動態資源發送請求的時候,每次都經過Akamai CDN進行轉發,這樣反而會影響網站的性能。那麼咱們怎麼對全部動態資源的請求都繞過Akamai CDN,直接訪問Apple的服務器呢?咱們觀察到apple主頁url和搜索表單url都指向相同的域名www.apple.com(這是因爲瀏覽器同源策略的強制規定),因此若是咱們想要對動態資源的請求直接訪問apple服務器,就只能把 www.apple.com 直接指向apple服務器,這樣作的損失就是另外一個靜態資源:apple的html主頁http://www.apple.com/ 也將直接從apple服務器獲取,沒法從Akamai CDN獲取,用戶對主頁的訪問將變慢。修改後以下圖。
以上兩種方式,Apple選擇了第一種方式,你們能夠根據本身網站的狀況進行選擇。
接下來咱們經過圖解來看一下當訪問http://www.apple.com 時,apple主頁經過CDN獲取html頁面的全過程
(1) 用戶向電信運營商的本地DNS遞歸查詢服務器(如下簡稱local telcom DNS)詢問 www.apple.com 的ip地址。
(2,3) local telcom DNS向根域名服務器和.com頂級域名服務器進行遞歸查詢apple.com的權威域名服務器地址。
(4,5) local telcom DNS向apple.com權威域名服務器查詢www.apple.com 的ip,獲得指向Akamai域名的CNAME記錄:www.isg-apple.com.akadns.net,該域名由Akamai擁有。接着local telcom DNS向www.isg-apple.com.akadns.net發起DNS查詢請求,獲得另外一個CNAME記錄 www.apple.com.edgekey.net ,該域名一樣由Akamai擁有。和上一步同樣,接着local telcom DNS向www.apple.com.edgekey.net 發起域名查詢請求,獲得另外一個CNAME記錄 e3191.dscc.akamaiedge.net ,該域名仍是由Akamai擁有(akadns.net, edgekey, akamaiedge.net 都是Akamai控制的域名)。(由上面的dig截圖咱們知道,e3191.dscc.akamaiedge.net 是最後一次CNAME記錄的域名,也是akamai的智能DNS服務器,它能根據用戶所處的地理位置和當前網絡負載狀況給出最合適的服務器ip地址。)
(6,7) local telcom DNS向根域名服務器和.net頂級域名服務器進行遞歸查詢akamaiedge.net的權威域名服務器地址。
(8,9) lcoal telcom DNS向akamaiedge.net的權威域名服務器查詢e3191.dscc.akamaiedge.net 的ip, 獲得的返回結果爲Akamai CDN edge server的ip,通常是離用戶地理位置最近的那個edge server服務器。
(10) local telcom DNS將Akamai CDN edge server的ip返回給用戶的計算機。
(11) 用戶向Akamai CDN edge server發送請求。
(12) Akamai CDN edge server會進行判斷:若是是靜態資源請求且緩存已通過期,或者是動態資源請求,會向apple源服務器發送請求,不然直接轉到(13)。
(13) Akamai CDN edge server將緩存的靜態資源或者做爲代理轉發的動態資源返回給用戶。
咱們平時看到的對CDN的使用基本就是按照上圖的流程來進行的。