前端性能-gzip壓縮

壓縮通過減少http響應的大小來減少響應時間逸寓。如果Http請求得到更小的響應,服務器和瀏覽器之間就會有更少的包被傳送驴剔,傳輸時間就減少了碟刺。

壓縮是怎么工作的

從Http/1.1開始,瀏覽器通過在http請求頭中添加Accept-Encoding頭來支持壓縮除抛;

Accept-Encoding: gzip,deflate

如果web服務器從請求頭中發(fā)現(xiàn)Accept-Encoding頭狮杨,它可能使用Accept-Encoding指定的壓縮算法列表中的一個來壓縮響應。web服務器通過響應頭中的Content-Encoding頭來通知瀏覽器響應內(nèi)容使用了哪種壓縮算法到忽;

Content-Encoding:gzip

Gzip是目前最流行而且很有效率的壓縮方法橄教。另外一種壓縮算法是deflate,但是它稍微低效點并且不是很流行,支持deflate的瀏覽器也支持gzip喘漏,但是有些支持gzip的瀏覽器不支持deflate,所以gzip更適合作為壓縮響應的方法护蝶。

哪些需要被壓縮

很多網(wǎng)站壓縮他們的HTML文檔,但是壓縮你的scripts腳本和stylesheet樣式文件是值得的(事實上壓縮任何text類型的響應陷遮,包括XML和JSON都是是值得的)滓走,圖片和PDF文件不應該被壓縮,因為他們已經(jīng)是壓縮的了帽馋,試著壓縮他們會浪費CPU資源而且可能潛在增加文件大小搅方。

壓縮有一項成本:它會帶來額外的服務器端壓縮和客戶端解壓縮的CPU資源。為了權衡利弊绽族,你需要去考慮響應的大小姨涡,網(wǎng)絡的帶寬,以及服務器和瀏覽器之間的網(wǎng)絡距離等因素吧慢,這些信息通常是不容易獲取的涛漂。所以,一般對于超過1k或者2k的文件都是值得去壓縮的。

壓縮率

壓縮通常能減少響應70%左右的大小

代理緩存

當瀏覽器發(fā)送經(jīng)過代理的請求匈仗,情況相對會變得復雜瓢剿。假設來自不支持gzip的瀏覽器發(fā)起第一次請求到代理服務器,因為是第一次請求悠轩,所以代理服務器的緩存是空的间狂,代理把請求轉(zhuǎn)發(fā)給web服務器,web服務器作一個未壓縮的響應火架。這個未壓縮的響應被代理緩存并且發(fā)送給瀏覽器〖螅現(xiàn)在,假第二個支持gzip壓縮的請求發(fā)送到代理何鸡,代理從緩存中取出未壓縮的數(shù)據(jù)作為響應纺弊,這樣就丟失了使用gzip的能力。

更糟糕的是骡男,如果第一次請求來自支持gzip的瀏覽器而第二次請求來自一個不支持的瀏覽器淆游,這種情況下,代理緩存中有一個內(nèi)容的壓縮版本并且為不管是否支持gzip壓縮的瀏覽器都提供服務洞翩。

解決這個問題的方法是在你的web服務響應頭中添加一個Vary header字段稽犁,web服務器通知代理基于一個或多個請求頭來做不同的緩存響應。因為是否壓縮是基于Accept-Encoding頭骚亿,所有有理由在web服務器的響應的vary頭字段中包含Accept-Encoding

Vary: Accept-Encoding

這會導致代理會基于請求頭Accept-Encoding字段的每個一個值緩存不同的響應內(nèi)容版本。在我們之前的例子中熊赖,代理將緩存兩個每個響應的兩個版本:當Accept-Encoding是gzip時的壓縮內(nèi)容来屠,和Accept-Encoding完全沒有指定時的非壓縮版本。當瀏覽器發(fā)起一個帶Accept-Encoding:gzip的請求到代理震鹉,代理會取緩存中壓縮的版本并作為響應到瀏覽器俱笛,如果沒有Accept-Encoding:gzip頭,瀏覽器將受到未壓縮的版本传趾。

代理邊緣情況

雖然有90%的瀏覽器聲稱支持gzip迎膜,但是可能其中有些瀏覽器在解壓方面存在bug。一個比較安全的方法是向被證實支持壓縮的瀏覽器才提供壓縮內(nèi)容的服務浆兰,比如IE6+和Mozilla 5.0+

web服務器可以通過配置User-Agent的類型條件來對指定壓縮安全的瀏覽器提供壓縮支持磕仅,比如Apache 1.3設置如下

mod_gzip_item_include reqheader "User-Agent: MSIE [6-9]"
mod_gzip_item_include reqheader "User-Agent: Mozilla/[5-9]"

添加緩存混合這些瀏覽器的邊緣情況,最好的方法是添加User-Agent到Vary頭中

Vary: Accept-Encoding,User-Agent

這樣代理就會根據(jù)請求的Accept-Encoding和User-Agent的值來緩存不同的web服務器響應版本簸呈,便于下次請求直接作出響應榕订。但是代理基于Accept-Encoding和User-Agent請求頭的組合緩存所有請求URL的響應內(nèi)容,是不太可能的蜕便。

這個問題實質(zhì)上是平衡壓縮和緩存兩者的問題劫恒,怎么處理還是得依據(jù)網(wǎng)站的實際情況:

  • 如果你的網(wǎng)站有比較少的用戶并且他們是比較小眾的(比如都使用firefox1.5),邊緣情況就可以幾乎不考慮,壓縮你的內(nèi)容并且使用Vary:Accept-Encoding两嘴,這樣就通過減少響應大小并且使用代理緩存來增強了網(wǎng)站的性能丛楚。
  • 如果你更關心節(jié)省網(wǎng)絡帶寬,同樣壓縮你的內(nèi)容和使用Vary:Accept-Encoding憔辫。這樣減少了web服務器的網(wǎng)絡帶寬并且增加了被代理處理的請求數(shù)量
  • 如果你有一個大的不同的用戶趣些,能夠負擔得起比較高的帶寬開銷和一個高質(zhì)量的口碑,壓縮你的內(nèi)容和使用Cache-Control:Private螺垢。這個會使代理不再緩存喧务,但是避免了邊緣情況的bug
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枉圃,隨后出現(xiàn)的幾起案子功茴,更是在濱河造成了極大的恐慌,老刑警劉巖孽亲,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坎穿,死亡現(xiàn)場離奇詭異,居然都是意外死亡返劲,警方通過查閱死者的電腦和手機玲昧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篮绿,“玉大人孵延,你說我怎么就攤上這事∏着洌” “怎么了尘应?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吼虎。 經(jīng)常有香客問我犬钢,道長,這世上最難降的妖魔是什么思灰? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任玷犹,我火速辦了婚禮,結果婚禮上洒疚,老公的妹妹穿的比我還像新娘歹颓。我一直安慰自己,他們只是感情好拳亿,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布晴股。 她就那樣靜靜地躺著,像睡著了一般肺魁。 火紅的嫁衣襯著肌膚如雪电湘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音寂呛,去河邊找鬼怎诫。 笑死,一個胖子當著我的面吹牛贷痪,可吹牛的內(nèi)容都是我干的幻妓。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼劫拢,長吁一口氣:“原來是場噩夢啊……” “哼肉津!你這毒婦竟也來了?” 一聲冷哼從身側響起舱沧,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤妹沙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熟吏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體距糖,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年牵寺,在試婚紗的時候發(fā)現(xiàn)自己被綠了悍引。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡帽氓,死狀恐怖趣斤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黎休,我是刑警寧澤唬渗,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站奋渔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壮啊。R本人自食惡果不足惜嫉鲸,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歹啼。 院中可真熱鬧玄渗,春花似錦、人聲如沸狸眼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拓萌。三九已至岁钓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屡限。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工品嚣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钧大。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓翰撑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啊央。 傳聞我的和親對象是個殘疾皇子眶诈,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容

  • API定義規(guī)范 本規(guī)范設計基于如下使用場景: 請求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,557評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理瓜饥,服務發(fā)現(xiàn)逝撬,斷路器,智...
    卡卡羅2017閱讀 134,714評論 18 139
  • 一压固、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,373評論 6 152
  • Http協(xié)議詳解 標簽(空格分隔): Linux 聲明:本片文章非原創(chuàng)球拦,內(nèi)容來源于博客園作者MIN飛翔的HTTP協(xié)...
    Sivin閱讀 5,226評論 3 82
  • 一本好書,在讀它之前是有預感的帐我。 生命是什么坎炼?福岡伸一給出的答案是: 生命是一組系統(tǒng)在時間里流動的過程。生物體在這...
    李心牧閱讀 1,314評論 0 0