本文章以比較通俗的語(yǔ)言講述下 CDN 是什么,CDN 為什么能加速網(wǎng)站訪問(wèn),為什么大部分網(wǎng)站都要使用 CDN,涉及細(xì)節(jié)部分并不需要我們用戶了解,所以不會(huì)詳細(xì)描述。文章如有錯(cuò)誤,歡迎指出,也歡迎一起探討。
1、CDN 是什么
CDN即內(nèi)容分發(fā)網(wǎng)絡(luò)(Content Delivery Network)的簡(jiǎn)稱。簡(jiǎn)單地說(shuō)就是 CDN 廠商在全國(guó)甚至全球各地,都部署了機(jī)房,每個(gè)機(jī)房就是一個(gè) CDN 節(jié)點(diǎn),然后節(jié)點(diǎn)自身也做了一定的優(yōu)化。然后北京的用戶訪問(wèn)就會(huì)分配到北京或者北京周邊的節(jié)點(diǎn),深圳的用戶訪問(wèn)就會(huì)分配到深圳或者深圳周邊的節(jié)點(diǎn),就近原則;如果你的網(wǎng)站流量很大,這種策略也類似于負(fù)載均衡(一對(duì)一、一對(duì)多),一萬(wàn)個(gè)人同時(shí)訪問(wèn)你的網(wǎng)站,分配到全國(guó)各個(gè)節(jié)點(diǎn)肯定比只分配到一臺(tái)服務(wù)器是要好的。
2、為什么 CDN 能夠加速網(wǎng)站訪問(wèn)
首先說(shuō)下最常見(jiàn)的網(wǎng)站架構(gòu),最常見(jiàn)的網(wǎng)站是搭建在一臺(tái)服務(wù)器上的,服務(wù)器上配置好 nginx、mysql、php 等網(wǎng)站運(yùn)行的必備環(huán)境,然后網(wǎng)站就可以運(yùn)行起來(lái),可以通過(guò) IP 地址訪問(wèn),如果你有域名的話,可以通過(guò)把域名解析到這個(gè) IP 地址,然后用戶輸入域名就可以訪問(wèn)你的網(wǎng)站了。
2.1、沒(méi)有 CDN 之前訪問(wèn)情況
比如你的服務(wù)器在北京,這時(shí)候北京的用戶訪問(wèn)你的網(wǎng)站,離服務(wù)器近,訪問(wèn)速度當(dāng)然也快;深圳的用戶訪問(wèn)你的網(wǎng)站,由于離北京比較遠(yuǎn),訪問(wèn)速度相對(duì)于北京用戶來(lái)說(shuō)會(huì)稍慢,但是由于都在國(guó)內(nèi),差異不大;如果這時(shí)候美國(guó)的用戶訪問(wèn)你的網(wǎng)站,由于這時(shí)候?qū)儆诳鐕?guó)訪問(wèn),訪問(wèn)網(wǎng)站的速度就會(huì)大大下降,嚴(yán)重影響用戶體驗(yàn)。
2.1、使用 CDN 之后訪問(wèn)情況
當(dāng)你的網(wǎng)站使用 CDN 后,北京的用戶訪問(wèn)你的網(wǎng)站,會(huì)分配到北京或者北京周邊的節(jié)點(diǎn);深圳的用戶訪問(wèn)會(huì)分配到深圳或者深圳周邊的節(jié)點(diǎn);美國(guó)的用戶訪問(wèn)會(huì)分配到美國(guó)或者美國(guó)周邊的節(jié)點(diǎn)。當(dāng)訪問(wèn)人數(shù)很多的時(shí)候,還能夠減小你北京服務(wù)器(源站)的壓力,因?yàn)檫@時(shí)候用戶訪問(wèn)的請(qǐng)求其實(shí)沒(méi)有到服務(wù)器,全部在 CDN 節(jié)點(diǎn)上。
并且當(dāng)該節(jié)點(diǎn)收到請(qǐng)請(qǐng)求后,會(huì)把該請(qǐng)求內(nèi)容緩存到 CDN 節(jié)點(diǎn)上,后續(xù)還有用戶訪問(wèn)到該 CDN 節(jié)點(diǎn),則直接返回,訪問(wèn)速度大大提高,所以有時(shí)候會(huì)發(fā)現(xiàn)用了 CDN,但是請(qǐng)求還是慢,一般是因?yàn)槭浅醮卧L問(wèn),該 CDN 節(jié)點(diǎn)沒(méi)有該內(nèi)容的緩存,也就是沒(méi)有命中緩存,后續(xù)再次訪問(wèn)的話就會(huì)很快。
3、使用 CDN 后的利弊
3.1、利
- 加速網(wǎng)站訪問(wèn),就近分配節(jié)點(diǎn),實(shí)現(xiàn)跨運(yùn)營(yíng)商,跨區(qū)域全網(wǎng)覆蓋。
- 隱藏服務(wù)器真實(shí) IP 地址
- 可以使用各 CDN 產(chǎn)商的功能,比如防盜鏈,不同資源的針對(duì)性加速等等
- 節(jié)約服務(wù)器成本。即使購(gòu)買 1 核 1 G 1M 的服務(wù)器也能應(yīng)對(duì)大部分場(chǎng)景,因?yàn)橹挥械谝淮尾判枰卦?,后續(xù)訪問(wèn)的壓力都在 CDN 節(jié)點(diǎn)
3.2、弊
- 當(dāng)一個(gè)文件名相同的文件,文件的內(nèi)容發(fā)生了變化,由于之前已經(jīng)有用戶訪問(wèn)了該文件,文件就被緩存到 CDN 節(jié)點(diǎn)中,這時(shí)候你即使已經(jīng)上傳了新的文件,用戶訪問(wèn)的還是舊文件,這時(shí)候就需要手動(dòng)刷新 CDN 緩存或者帶 query 參數(shù)請(qǐng)求,CDN 節(jié)點(diǎn)才會(huì)再次回到原站請(qǐng)求最新的文件。有時(shí)候開(kāi)發(fā)過(guò)程中沒(méi)注意這個(gè)問(wèn)題會(huì)非常苦惱。
- 一不小心一棟樓就沒(méi)了,使用 CDN 記得配置到防盜鏈等訪問(wèn)控制,不然很容易被盜刷。
4、CDN常用名詞解釋
- 加速域名:也就是你在 CDN 廠商后臺(tái)添加的域名,比如你添加了一個(gè)域名,cdn.timhbw.com,那么這個(gè)就是加速域名,并不是說(shuō)你現(xiàn)在網(wǎng)站的域名(timhbw.com)
- CNAME 記錄:在你的域名解析商,點(diǎn)擊【添加解析】的時(shí)候,會(huì)讓你選擇記錄類型,用的最多的是 A,就是指向 IP。CNAME 也是記錄類型的一種,Canonical Name 翻譯為中文也就是別名。比如 cdn.timhbw.com 你添加了一個(gè) CNAME 記錄,記錄值是:timhbw.com,那么訪問(wèn) cdn.timhbw.com的時(shí)候,所有的請(qǐng)求會(huì)轉(zhuǎn)到 timhbw.com。
- CNAME 域名:你在 CDN 廠商添加加速域名 cdn.timhbw.com,就會(huì)自動(dòng)分配一個(gè) CNAME 域名,比如七牛云是 xxx.qiniudns.com,騰訊云是:xxx.cdn.dnsv1.com,阿里云是:xxx.kunlun.com 類似這種。
- 動(dòng)態(tài)內(nèi)容:是指多次訪問(wèn)同一內(nèi)容,響應(yīng)返回的數(shù)據(jù)是不是相同的,比如API 接口、.jsp、.aps、.php等
- 靜態(tài)內(nèi)容:是指多次訪問(wèn)同一內(nèi)容,響應(yīng)返回的數(shù)據(jù)是相同的,比如圖片、html、js、css、apk、ipa等
- DNS:也就是域名解析服務(wù)。作用就是你輸入 timhbw.com 后,會(huì)自動(dòng)把域名轉(zhuǎn)換為網(wǎng)絡(luò)可以識(shí)別的 IP 地址,經(jīng)過(guò)一系列處理后,瀏覽器上就可以服務(wù)器返回的內(nèi)容。
- 邊緣節(jié)點(diǎn)(CDN 節(jié)點(diǎn)):也就是前面提到的 CDN 節(jié)點(diǎn)
- 命中率:用戶請(qǐng)求的時(shí)候,如果該節(jié)點(diǎn)已緩存訪問(wèn)的內(nèi)容,則直接返回給客戶,則是HIT(命中),如果 CDN 節(jié)點(diǎn)沒(méi)有該內(nèi)容緩存,就需要回到源站獲取,成為 MISS(未命中)。命中的請(qǐng)求數(shù)占總請(qǐng)求數(shù)的百分比就是命中率。
- 中間源:位于源站 和 邊緣節(jié)點(diǎn) 中間的一個(gè)回源服務(wù)器。中間源服務(wù)器可緩存多個(gè)邊緣節(jié)點(diǎn)的回源請(qǐng)求,對(duì)同一內(nèi)容的請(qǐng)求,中間源服務(wù)器只需進(jìn)行一次回源即可將內(nèi)容分發(fā)至各邊緣節(jié)點(diǎn),可以降低源站的壓力。
- 源站:就是實(shí)際的業(yè)務(wù)服務(wù)器,比如你的云主機(jī),或者各大廠商的對(duì)象存儲(chǔ)等
- 回源:當(dāng)用戶發(fā)起一個(gè)請(qǐng)求,邊緣節(jié)點(diǎn)發(fā)現(xiàn)沒(méi)有緩存該內(nèi)容,則會(huì)回到源站去請(qǐng)求該內(nèi)容。
- 冷資源:如前面所說(shuō),CDN 是利用緩存加速,會(huì)把資源存儲(chǔ)在 CDN 節(jié)點(diǎn),但是由于 CDN 節(jié)點(diǎn)的存儲(chǔ)容量有限,當(dāng)存儲(chǔ)容量不夠后,會(huì)按照“最近最少使用”原則,將最近訪問(wèn)的資源中訪問(wèn)頻率最低的資源從節(jié)點(diǎn)中清除。
- range 回源(分片緩存):一般用在點(diǎn)播和下載平臺(tái)等大文件分發(fā),將一份文件拆分成若干個(gè)小文件回源,減少回源消耗流量。比如一個(gè) 500MB 的文件,當(dāng)開(kāi)啟 range 回源后,客戶端發(fā)起的請(qǐng)求中含有 range,則源站收到 CDN 的請(qǐng)求中也帶有 range,客戶端請(qǐng)求多少數(shù)據(jù)就響應(yīng)多少數(shù)據(jù),對(duì)應(yīng)的 HTTP 狀態(tài)碼是 206,請(qǐng)求中斷后也不會(huì)再請(qǐng)求。當(dāng)沒(méi)有開(kāi)啟 range 回源的時(shí)候,客戶端發(fā)起的請(qǐng)求中含有 range,但是源站收到 CDN 的請(qǐng)求沒(méi)有帶 range,源站會(huì)返回完整的 500MB 的數(shù)據(jù),會(huì)導(dǎo)致回源放大問(wèn)題,就是 CDN只請(qǐng)求了 10MB 數(shù)據(jù),但是源站卻返回了 500MB 數(shù)據(jù)。
- 回源 HOST:回源 HOST 決定了 CDN 節(jié)點(diǎn)在回源站請(qǐng)求資源的時(shí)候,在源站訪問(wèn)的站點(diǎn)域名,也就是訪問(wèn)到該 IP 上的哪個(gè)站點(diǎn),也就是 nginx 配置中的 server_name。
- 回源協(xié)議(協(xié)議回源):比如客戶端使用 HTTPS方式請(qǐng)求資源,當(dāng) CDN 節(jié)點(diǎn)上沒(méi)有緩存該資源,就會(huì)以相同的 HTTPS 方式請(qǐng)求源站獲取內(nèi)容。同理如果是客戶端是 HTTP 請(qǐng)求,則 CDN 節(jié)點(diǎn)也以 HTTP 方式請(qǐng)求源站獲取內(nèi)容。
- 去參數(shù)回源(過(guò)濾參數(shù)):比如你使用兩種方式訪問(wèn)同一個(gè)資源:https://static.timhbw.com/logo.jpg?test、https://static.timhbw.com/logo.jpg?cdn,可以看到鏈接后面有?test,這個(gè)叫 query 參數(shù)
- 如果這個(gè)功能開(kāi)啟,則 CDN 節(jié)點(diǎn)會(huì)使用 https://static.timhbw.com/logo.jpg 向源站發(fā)起請(qǐng)求,然后緩存
- 如果這個(gè)功能關(guān)閉,則 CDN 節(jié)點(diǎn)會(huì)使用 https://static.timhbw.com/logo.jpg?test 、https://static.timhbw.com/logo.jpg?cdn 分別向源站發(fā)起請(qǐng)求,然后分別緩存。
原文鏈接:點(diǎn)我