CDN = Content Delivery Network。其目的是通過在現(xiàn)有的Internet中增加一層新的網(wǎng)絡(luò)架構(gòu),將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡(luò)”邊緣”,使用戶可以就近取得所需的內(nèi)容,解決Internet網(wǎng)絡(luò)擁擠的狀況,提高用戶訪問網(wǎng)站的響應(yīng)速度。(內(nèi)容來自百度百科)
CDN多數(shù)時候被用來分發(fā)一些靜態(tài)文件(雖然也支持動態(tài)文件),比如js, css以及網(wǎng)頁里使用的圖片,都可以放在CDN上。把靜態(tài)文件托管在別處好處很多,不僅可以避開瀏覽器的連接數(shù)限制,而且不會發(fā)送沒用的cookie。更多這方面的心得請看Fenng的舊文。
現(xiàn)在有了Google Appengine,就可以用Google的服務(wù)器來存放靜態(tài)文件,起到CDN的效果。也是我寫這篇文章的初衷。在Appengine上托管靜態(tài)文件極其簡單:
第一步,在Appengine上新建一個應(yīng)用。
第二步,在本地新建項目文件夾,并創(chuàng)建幾個用于存放靜態(tài)文件的目錄,如img, javascripts之類的。
第三步,在項目文件夾中創(chuàng)建一個app.yaml文件,內(nèi)容如下:
application: YOUR_APP_ID
version: 1
runtime: python
api_version: 1handlers:
- url: /img
static_dir: img- url: /javascripts
static_dir: javascripts- url: /stylesheets
static_dir: stylesheets
最后,把要Appengine托管的靜態(tài)文件放到相應(yīng)的文件夾,使用appcfg.py 把文件上傳到服務(wù)器,大功告成。所有加入的靜態(tài)文件應(yīng)該已經(jīng)都能訪問了。
我托管了的prototype.js:http://niupucdn.appspot.com/javascripts/prototype.js
需要注意的是,Appengine對文件大小和文件數(shù)量都有限制。如果小文件過多(超過了1000),可以考慮采用zip壓縮,但也要避免壓縮之后文件體積超過1M。
經(jīng)過我觀察,用Appengine托管靜態(tài)文件也有不足:沒有ETag,也無法返回304。只是會在響應(yīng)頭信息里設(shè)置10分鐘后過期。在這方面可控性太低。
看看后臺的圖表,感覺很漂亮:
7 Responses to “用Google App Engine做山寨CDN”
我想問下,這樣做有什么好處嗎?將一些放在博客上的JS文件改為放在Google上會不會快一點?
@小三
說實話,在國內(nèi)是不會快多少的。如果有一臺國內(nèi)服務(wù)器會更好。但如果是針對國外的話,放在google那確實可以快很多。
相反的,這樣結(jié)構(gòu)的外部鏈接是不是不能在app engine里使用了呢?
http://niupucdn.appspot.com/javascripts/prototype.js
@linsk
為什么不行呢?
可能是我沒理解好 fetch URL這個東西吧,有點混淆…
深深感到?jīng)]有天賦…
好吧,順便再問個問題,你的speedtest mini有記錄測試者測試后的數(shù)據(jù)么?
@linsk
不會
[...] 以前用GAE的時候,寫過一篇《用Google App Engine做山寨CDN》。但GAE服務(wù)器遠在國外,不時被封;并且本身有不少限制(如文件數(shù)量不超過1K,單個文件不超過1M等),所以拿來做CDN并不那么爽。注冊了SAE賬號以后,第一時間就想把GAE上的靜態(tài)文件們,挪到SAE上來。 [...]