亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 1552 | 回復(fù): 0
打印 上一主題 下一主題

如何利用HTTP緩存提高網(wǎng)頁(yè)性能 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-12-20 09:48 |只看該作者 |倒序?yàn)g覽

網(wǎng)站的性能(Performance)要考慮兩方面,一方面是在Server端的運(yùn)行效率,另一方面是在Client端感受到的效率。不要以為Server端效率高這個(gè)網(wǎng)站或者服務(wù)給用戶的體驗(yàn)就是高效的,如果不考慮影響Client Performance的因素,Server端跑得再快用戶也可能感覺(jué)慢得和牛一樣。

Yahoo的哥們做的研究真不是蓋,他們還寫(xiě)了本書(shū)《High Performance Web Sites》詳細(xì)介紹如果提高Client Performance。公司內(nèi)部也有一個(gè)Team做這方面的事情,聽(tīng)過(guò)他們的培訓(xùn),和Yahoo說(shuō)的差不多,所謂英雄所見(jiàn)略同。

給靜態(tài)資源(HTML文件,圖片文件等)的Repsone加上Expires/Cache-Control Header是很有效的一招。如果HTTP Response中有Expires這樣的Header的話,瀏覽器會(huì)Cache這個(gè)資源,理想狀況下(注意,只是理想狀況),在Expire Date之前,不會(huì)再發(fā)HTTP請(qǐng)求給Server要這個(gè)資源,不過(guò)Expires的值只能是一個(gè)固定日期,比如“Thu 27 Nov 2008 07:00:00 GMT”,不能是一個(gè)類(lèi)似從現(xiàn)在開(kāi)始之后10這樣一個(gè)隨機(jī)浮動(dòng)的值,如果要這樣的效果,可以用Cache-Control這樣的Header,如果HTTP Resposne中有這樣的Header:“Cache-Control: max-age = 100”,表示這個(gè)資源在cache中的最大壽命是100秒。一般說(shuō)來(lái)這種靜態(tài)文件永遠(yuǎn)不應(yīng)該過(guò)期,如果真的要給這個(gè)Cache加上一個(gè)期限,那我希望是——一萬(wàn)年,“Cache-Control: max-age = 315360000000”;

其實(shí)就應(yīng)該給Expires設(shè)一個(gè)永遠(yuǎn)不會(huì)過(guò)期的時(shí)間,比如你現(xiàn)在有一個(gè)文件叫logo.gif,需要用一個(gè)新的logo的時(shí)候,你不要去覆蓋原來(lái)的文件,而把新的logo存成logo_v2.gif,讓相關(guān)網(wǎng)頁(yè)引用新的logo_v2.gif,這樣可以讓新老網(wǎng)頁(yè)同時(shí)工作,實(shí)在犯不上為了節(jié)省存儲(chǔ)空間覆蓋原有文件。

對(duì)Apache服務(wù)器,使用mod_expires,在httpd.conf或者.htaccess中加上

<FilesMatch "\\.(ico|gif|jpg|html)$">
ExpiresDefault "access plus 10 years"
</FileMatch>

還有,同一個(gè)HTTP Response中可以同時(shí)有ExpiresCache-Control,但是Cache-Control權(quán)限比Expires大,會(huì)override它的。

HTTPResponse中還會(huì)有另外一個(gè)HeaderLast-Modified,比如“Last-Modified: Thu, 06 Apr 2006 21:17:12 GMT”,瀏覽器訪問(wèn)一個(gè)URI得到這樣的Resposne之后,就知道這個(gè)資源最后一次的修改時(shí)間,下次需要再次獲得這個(gè)資源的時(shí)候,會(huì)發(fā)一個(gè)RequestServer,不過(guò)這個(gè)Request中有一條“If-Unmodified-Since: Thu, 06 Apr 2006 21:17:12 GMT”,如果在Server端在這個(gè)日期之后對(duì)這個(gè)資源進(jìn)行了修改,就會(huì)照常返回這個(gè)資源給Client端,但是如果沒(méi)有修改,就會(huì)返回一個(gè)304 (Not Modified) Response而不返回資源,告訴Client端:這個(gè)資源從上次給你之來(lái)從來(lái)沒(méi)改過(guò),你放心用你Cache中的好了。一個(gè)304 Response比一個(gè)靜態(tài)資源通常小多了,這樣就節(jié)省了網(wǎng)絡(luò)帶寬。

讓我們回過(guò)頭來(lái)比較一下ExpiresLast-Modified這兩個(gè)東西,似乎Last-Modified比不上Expires,因?yàn)殡m然它能夠節(jié)省一點(diǎn)帶寬,但是還是逃不掉發(fā)一個(gè)HTTP請(qǐng)求出去,而Expires卻使得瀏覽器干脆連HTTP請(qǐng)求都不用發(fā),豈不痛快!那還要Last-Modified這個(gè)物體干什么?理想狀況的確是這樣,不過(guò)當(dāng)用戶在IE或者Firefox里面按F5或者點(diǎn)擊Refresh按鈕的時(shí)候(不是在URL欄里重新輸入一遍URL然后回車(chē)),就算對(duì)于有ExpiresURI,一樣也會(huì)發(fā)一個(gè)HTTP請(qǐng)求出去,所以,Last-Modified還是要用的,而且要和Expires一起用。

除了Last-Modified,HTTP Response中還可能有另外一個(gè)Header: ETag,使得Server上的靜態(tài)資源有點(diǎn)版本控制的味道;假如HTTP Response中包含“ETag: "abcdefg1234:0001"”,等于告訴Client端,你拿到的這個(gè)版本的資源有個(gè)ID,叫做abcdefg1234:0001,下次需要發(fā)Request索要同一個(gè)URI的時(shí)候,在Request里面加一條“If-None-Match: "abcdefg1234:0001"”,好,Server端做了一些修改,下次這個(gè)Client再來(lái)了一個(gè)請(qǐng)求,但是這時(shí)候資源已經(jīng)改了,所以返回這個(gè)新資源,還有新的tag “ETag: "abcdefg4567:0001"”(這個(gè)etag我是胡寫(xiě)的),這樣,Client端等于Cache了兩份,在需要索要這個(gè)資源的時(shí)候,可以包含這樣的Header: “If-None-Match: "abcdefg1234:0001" "abcdefg4567:0001"”,這樣,即使Server端頭腦發(fā)熱,把這個(gè)資源Roll back回原來(lái)的版本,依然會(huì)返回304 (Not Modified) Response,因?yàn)樗?/span>ClientCache著以前的版本呢,這點(diǎn)功能是Last-Modifed/If-Not-Modified沒(méi)法做到的。

不過(guò)ETag/If-None-Match這點(diǎn)功能實(shí)在是個(gè)雞肋,首先,Server端的資源不大可能Roll Back,更重要的是,有可能造成Client Performance下降。對(duì)于只有一個(gè)Server的網(wǎng)站,沒(méi)什么問(wèn)題,但是現(xiàn)在稍微上點(diǎn)規(guī)模的網(wǎng)站都需要Scale Out,也就是說(shuō)需要前端一個(gè)Load Balancer,后面接多臺(tái)Server來(lái)處理請(qǐng)求,俗稱Cluster,既然是Cluster,那么每個(gè)請(qǐng)求到底返回什么結(jié)果應(yīng)該和分配到哪個(gè)Server無(wú)關(guān),不過(guò)這個(gè)ETag可能就壞事了。假如用戶的第一次請(qǐng)求分配給Server A,返回“ETag: "abcdefg1234:0001"”,但是第二次請(qǐng)求分配給了Server BServer B上這個(gè)資源和Server A上的一模一樣,但是計(jì)算出這個(gè)資源的ETag"abcdefg1234:0002",這下麻煩了,雖然內(nèi)容一樣,但是ETag不匹配,還是浪費(fèi)了帶寬把資源發(fā)送了一遍,冤枉!而事實(shí)上,不同Server上的ETag很有可能不同,對(duì)于Apache,ETag的計(jì)算考慮了inode,對(duì)于IIS,ETag考慮了metabase的修改版本,要保證不同server上的這些信息一致,有點(diǎn)小難。不過(guò)不是有Last-Modified/If-Not-Modified嗎?Server端看到If-Modified-Since,對(duì)照一下時(shí)間對(duì)得上,不管If-None-Match,可以直接發(fā)回304(Not Modified)呀,很不幸,RFC2616對(duì)這種情況做了規(guī),如果既有If-None-Match又有If-Modified-Since,除非兩者不沖突,不然不會(huì)返回304。

所以說(shuō)ETag就是一個(gè)害人精,按照Yahoo的建議,別費(fèi)勁想辦法同步不同Server上的ETag了,干脆就把ETag刪除得了(缺省,ApacheIIS都是有ETag),我Sniff了一下Yahoo的若干網(wǎng)頁(yè)返回HTTP Response,的確沒(méi)有ETag,人家的確是知行合;

對(duì)于Apache,在httpd.conf或者.htaccess中加一行就搞定了:

FileETag none

對(duì)于IIS 6,可就有點(diǎn)費(fèi)勁了,首先,似乎沒(méi)有辦法通過(guò)Config來(lái)把ETag去掉,查了很多資料,問(wèn)了很多人,似乎能夠去掉ETag的辦法只有寫(xiě)一個(gè)ISAPI Filter來(lái),Sniff了一下Microsoft的幾個(gè)網(wǎng)頁(yè)的結(jié)果顯示ETag都穩(wěn)當(dāng)當(dāng)?shù)拇嬖,估?jì)目前真的沒(méi)有什么好方法。

只好退而取其次,保證不同Server上的ETag一致了。 IIS對(duì)Etag的計(jì)算算法是ETag = {Filetimestamp:ChangeNumber}, Filetimestamp保持一致沒(méi)什么問(wèn)題,ChangeNumbermetabasechange number,就有點(diǎn)難保證Cluster中每個(gè)Server都一樣了,所以,干脆就把它設(shè)成固定值好了,這個(gè)連告訴我們?cè)撛趺崔k,很可惜,沒(méi)有找到徹底刪除ETags的配置。

 

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP