CDN(Content Delivery Network)即內(nèi)容分發(fā)網(wǎng)絡(luò),通過在網(wǎng)絡(luò)各處放置節(jié)點(diǎn)服務(wù)器,構(gòu)成在現(xiàn)有的互聯(lián)網(wǎng)基礎(chǔ)之上的一層智能虛擬網(wǎng)絡(luò)。
CDN系統(tǒng)能夠?qū)崟r(shí)地根據(jù)網(wǎng)絡(luò)流量和各節(jié)點(diǎn)的連接、負(fù)載狀況以及到用戶的距離和響應(yīng)時(shí)間等綜合信息將用戶的請(qǐng)求重新導(dǎo)向離用戶最近的服務(wù)節(jié)點(diǎn)上,用于確保快速可靠地分發(fā)靜態(tài)內(nèi)容,這些內(nèi)容可以緩存,最適合在網(wǎng)速龐大的網(wǎng)絡(luò)中存儲(chǔ)和分發(fā)。
適用范圍
CDN 對(duì)于常見的 HTTP 請(qǐng)求方式(GET POST HEAD PUT DELETE OPTIONS)均是支持的,但是并不是對(duì)所有請(qǐng)求方式都會(huì)進(jìn)行緩存的。
CDN 僅會(huì)對(duì)于 GET 請(qǐng)求進(jìn)行緩存,而對(duì)于其他的請(qǐng)求均不進(jìn)行緩存,僅是起到中間代理、轉(zhuǎn)發(fā)的功能。
CDN 的站點(diǎn)源站最好能夠 將動(dòng)態(tài)請(qǐng)求和靜態(tài)請(qǐng)求的內(nèi)容獨(dú)立成兩個(gè)站點(diǎn),實(shí)現(xiàn)動(dòng)靜分離, CDN 僅加速靜態(tài)站點(diǎn)中的資源。
注意:
CDN 處理 HEAD 請(qǐng)求時(shí)會(huì)將 HEAD 請(qǐng)求轉(zhuǎn)換成 GET 請(qǐng)求回源,因此源站日志中記錄的是 GET 請(qǐng)求。
CDN 僅支持 POST 和 PUT 方式發(fā)送帶有請(qǐng)求體(BODY)的 HTTP 請(qǐng)求。
緩存規(guī)則
CDN 判斷一個(gè)資源是否進(jìn)行緩存時(shí),首先會(huì)根據(jù)源站對(duì)該資源是否設(shè)置了不進(jìn)行緩存的配置,具有最高優(yōu)先級(jí):
源站配置了緩存規(guī)則轉(zhuǎn) 2;
源站沒有任何配置轉(zhuǎn) 3 ;
瀏覽器緩存轉(zhuǎn) 7 。
源站配置了以下規(guī)則時(shí), CDN 不會(huì)進(jìn)行緩存,且瀏覽器也不會(huì)緩存,每次請(qǐng)求該資源都將訪問源站,無法進(jìn)行緩存加速,如果沒有則轉(zhuǎn) 4 :
Cache-Control 有s-maxage=0,no-cache,no-store,private其中一種
Cache-Control 沒有s-maxage或者s-maxage=0,但有max-age=0
有單獨(dú) no-cache 參數(shù)
源站沒有配置緩存規(guī)則時(shí),CDN 將根據(jù)CDN服務(wù)控制后臺(tái)緩存規(guī)則配置進(jìn)行緩存,如果代理商后臺(tái)配置了緩存規(guī)轉(zhuǎn) 4 ,沒有轉(zhuǎn) 5 。
CDN 服務(wù)控制后臺(tái)配置了緩存規(guī)則時(shí),將使用CDN 緩存策略覆蓋源站緩存策略,CDN緩存配置的優(yōu)先級(jí)為:
權(quán)重越高的優(yōu)先級(jí)越高;
同等優(yōu)先級(jí)后綴名優(yōu)先級(jí)高于目錄優(yōu)先級(jí);
相同權(quán)重且相同優(yōu)先級(jí)則隨機(jī)匹配(建議避免第三種場景)
CDN 服務(wù)控制后臺(tái)沒有配置緩存規(guī)則,則根據(jù)源站緩存規(guī)則進(jìn)行緩存,常見的源站緩存規(guī)則有 Cache-Control和 Expires 頭,根據(jù) HTTP 協(xié)議 Cache-Control 的優(yōu)先級(jí)高于 Expires 頭,并且 s-maxage 設(shè)置高于 max-age 設(shè)置。
CDN 和源站都沒有配置緩存規(guī)則,則遵循 CDN 默認(rèn)緩存規(guī)則,默認(rèn)緩存規(guī)則包括:
response 頭沒有 Etag 和 Last-Modified ,默認(rèn)是不緩存的(一般認(rèn)為此類文件為動(dòng)態(tài)文件);
沒有 Last-Modified ,有 Etag 的文件,默認(rèn)緩存 10 秒;
有 Last-Modified 按照 (當(dāng)前時(shí)間 - Last-Modified) * 0.1,且將其限制在 [10,3600] 區(qū)間內(nèi)。
源站設(shè)置了不緩存的規(guī)則時(shí),瀏覽器是不緩存的;如果 CDN 修改了 Cache-Control 或者 Expires 頭時(shí),瀏覽器會(huì)按照該修改頭緩存;如果沒有修改即會(huì)按照源站的策略緩存。
注意:更新靜態(tài)文件時(shí),在文件末尾增加版本號(hào)能使CDN立即生效,如bugall.js --> bugall.js?time=1402394823
緩存更新
緩存刷新方式有 URL 刷新、目錄刷新和 URL 預(yù)熱。
URL 刷新是以文件為單位進(jìn)行緩存刷新。
目錄刷新是以目錄為單位,將目錄下的所有文件進(jìn)行緩存刷新。
URL 預(yù)熱是以文件為單位進(jìn)行資源預(yù)熱。
刷新后,會(huì)刪除該資源在全網(wǎng) CDN 節(jié)點(diǎn)上的緩存。當(dāng)用戶請(qǐng)求到達(dá)節(jié)點(diǎn)時(shí),節(jié)點(diǎn)會(huì)回源站拉取對(duì)應(yīng)資源,返回給用戶并緩存到節(jié)點(diǎn),保證用戶獲取到最新資源。
預(yù)熱后,該資源會(huì)提前緩存到全網(wǎng) CDN 節(jié)點(diǎn)。當(dāng)用戶請(qǐng)求到達(dá)節(jié)點(diǎn)時(shí),可以直接在節(jié)點(diǎn)獲取到資源。
您在源站上更新資源后,如果希望用戶訪問不再獲取舊資源,直接獲取新資源,您可以使用 URL 刷新 或 目錄刷新 功能。
如果希望 CDN 預(yù)先將資源由源站主動(dòng)緩存至 CDN 節(jié)點(diǎn),則可以使用 URL 預(yù)熱 功能。