http快取提高效率

2022-03-06 00:58:11 字數 4291 閱讀 4194

給靜態資源(html檔案,檔案等)的repsone加上expires/cache-controlheader是很有效的一招。如果http response中有expires這樣的header的話,瀏覽器會cache這個資源,理想狀況下(注意,只是理想狀況),在expire date之前,不會再發http請求給server要這個資源,不過expires的值只能是乙個固定日期,比如「thu 27 nov 2008 07:00:00 gmt」,不能是乙個類似「從現在開始之後10年」這樣乙個隨機浮動的值,如果要這樣的效果,可以用cache-control這樣的header,如果http resposne中有這樣的header:「cache-control: max-age = 100」,表示這個資源在cache中的最大壽命是100秒。一般說來這種靜態檔案永遠不應該過期,如果真的要給這個cache加上乙個期限,那我希望是——一萬年,「cache-control: max-age = 315360000000」;

其實就應該給expires設乙個永遠不會過期的時間,比如你現在有乙個檔案叫logo.gif,需要用乙個新的logo的時候,你不要去覆蓋原來的檔案,而把新的logo存成logo_v2.gif,讓相關網頁引用新的logo_v2.gif,這樣可以讓新老網頁同時工作,實在犯不上為了節省儲存空間覆蓋原有檔案。

對apache伺服器,使用mod_expires,在httpd.conf或者.htaccess中加上

expiresdefault "access plus 10 years"

對於iis 6(iis 7還不清楚),通過iis manager可以通過gui新增expires/cache-control,通過命令列修改就麻煩一點了。

首先要到iis的adminscripts目錄下去找到adsutil.vbs檔案。

cd c:\inetpub\adminscripts

比如我們要給根目錄下的imags目錄新增expires/cache-control,先要在metabase中給它加乙個節點

cscript adsutil.vbs create w3svc/1/root/images "iiswebvirtualdir"

如果希望訪問images目錄下的檔案獲得cache-control: max-age=60,就這樣

如果希望訪問images目錄下的檔案獲得「expires: thu 27 nov 2008 07:00:00 gmt」,就這樣

還有,同乙個http response中可以同時有expires和cache-control,但是cache-control許可權比expires大,會override它的。

http的response中還會有另外乙個header叫last-modified,比如「last-modified: thu, 06 apr 2006 21:17:12 gmt」,瀏覽器訪問乙個uri得到這樣的resposne之後,就知道這個資源最後一次的修改時間,下次需要再次獲得這個資源的時候,會發乙個request給server,不過這個request中有一條「if-unmodified-since: thu, 06 apr 2006 21:17:12 gmt」,如果在server端在這個日期之後對這個資源進行了修改,就會照常返回這個資源給client端,但是如果沒有修改,就會返回乙個304 (not modified) response而不返回資源,告訴client端:「這個資源從上次給你之來從來沒改過,你放心用你cache中的好了。」 乙個304 response比乙個靜態資源通常小多了,這樣就節省了網路頻寬。

讓我們回過頭來比較一下expires和last-modified這兩個東西,似乎last-modified比不上expires,因為雖然它能夠節省一點頻寬,但是還是逃不掉發乙個http請求出去,而expires卻使得瀏覽器乾脆連http請求都不用發,豈不痛快!那還要last-modified這個物體幹什麼?理想狀況的確是這樣,不過當使用者在ie或者firefox裡面按f5或者點選refresh按鈕的時候(不是在url欄裡重新輸入一遍url然後回車),就算對於有expires的uri,一樣也會發乙個http請求出去,所以,last-modified還是要用的,而且要和expires一起用。

除了last-modified,http response中還可能有另外乙個header:etag,使得server上的靜態資源有點「版本控制」的味道;假如http response中包含「etag: "abcdefg1234:0001"」,等於告訴client端,你拿到的這個版本的資源有個id,叫做abcdefg1234:0001,下次需要發request索要同乙個uri的時候,在request裡面加一條「if-none-match: "abcdefg1234:0001"」,好,server端做了一些修改,下次這個client再來了乙個請求,但是這時候資源已經改了,所以返回這個新資源,還有新的tag 「etag: "abcdefg4567:0001"」(這個etag我是胡寫的),這樣,client端等於cache了兩份,在需要索要這個資源的時候,可以包含這樣的header: 「if-none-match: "abcdefg1234:0001" "abcdefg4567:0001"」,這樣,即使server端頭腦發熱,把這個資源roll back回原來的版本,依然會返回304 (not modified) response,因為它知道client端cache著以前的版本呢,這點功能是last-modifed/if-not-modified沒法做到的。

不過etag/if-none-match這點功能實在是個雞肋,首先,server端的資源不大可能roll back,更重要的是,有可能造成client performance下降。對於只有乙個server的**,沒什麼問題,但是現在稍微上點規模的**都需要scale out,也就是說需要前端乙個load balancer,後面接多台server來處理請求,俗稱cluster,既然是cluster,那麼每個請求到底返回什麼結果應該和分配到哪個server無關,不過這個etag可能就壞事了。假如使用者的第一次請求分配給server a,返回「etag: "abcdefg1234:0001"」,但是第二次請求分配給了server b,server b上這個資源和server a上的一模一樣,但是計算出這個資源的etag是"abcdefg1234:0002",這下麻煩了,雖然內容一樣,但是etag不匹配,還是浪費了頻寬把資源傳送了一遍,冤枉啊!而事實上,不同server上的etag很有可能不同,對於apache,etag的計算考慮了inode,對於iis,etag考慮了metabase的修改版本,要保證不同server上的這些資訊一致,有點小難。不過不是有last-modified/if-not-modified嗎?server端看到if-modified-since,對照一下時間對得上,不管if-none-match,可以直接發回304(not modified)呀,很不幸,rfc2616對這種情況做了規定

,如果既有if-none-match又有if-modified-since,除非兩者不衝突,不然不會返回304。

所以說etag就是乙個害人精,按照yahoo的建議,別費勁想辦法同步不同server上的etag了,乾脆就把etag刪除得了(預設,apache和iis都是有etag的),我sniff了一下yahoo的若干網頁返回http response,的確沒有etag,人家的確是知行合一

;對於apache,在httpd.conf或者.htaccess中加一行就搞定了:

fileetag none

對於iis 6,可就有點費勁了,首先,似乎沒有辦法通過config來把etag去掉,查了很多資料,問了很多人,似乎能夠去掉etag的辦法只有寫乙個isapi filter來弄

,sniff了一下microsoft的幾個網頁的結果顯示etag都穩當當的存在,估計目前真的沒有什麼好方法。

只好退而取其次,保證不同server上的etag一致了。 iis對etag的計算演算法是etag = , filetimestamp保持一致沒什麼問題,changenumber是metabase的change number,就有點難保證cluster中每個server都一樣了,所以,乾脆就把它設成固定值好了,這個連線

告訴我們該怎麼辦,很可惜,沒有找到徹底刪除etags的配置。

如何提高效率

如果問 你想不想使自己的收入加倍 我猜每個人的答案都是 yes 如果我繼續問 你相不相信現在你的收入會加倍 我想有一些人可能會沒把握,有一些人認為不太可能,我告訴各位 你們每個人的收入一定會加 倍 因為按照每年物價增長率及通貨膨脹的正常速度,20年後你的收入一定會加倍。但是如果你希望,提前在5年內 ...

Python 提高效率

最近師兄給了小任務,算乙個p值。任務詳情是這樣的 第一步,有基因集a,23個元素,基因集b,451個元素,共有23 451 9922個組合 當然你要考慮去重 看在ppi資料庫 145萬多行資料 中出現的組合總個數 觀察值 第二步,然後再以hg19中基因為背景基因集,放回隨機抽取23個基因構成基因集c...

如何提高效率

在提高班學習有很長的一段時間了,學習的收穫中有一點是非常的明顯,那就是自己的效率明顯的比原來高出許多,現在就按照自己的切身體會來總結一下如何提高自己效率.1 目標 必須要有目標,沒有目標和方向效率會大大的折扣.當然不僅僅是學習,更是生活,事業,和人的整個一生.這點公尺老師非常的重視,每個學習階段都給...