一、前言
最近做了個(gè)項(xiàng)目,遇到這么一個(gè)問(wèn)題:服務(wù)器返回給客戶端的json數(shù)據(jù)量太大(大概65M),在客戶端加載了1分多鐘才渲染完畢(當(dāng)然這加載時(shí)間也和本地的下行帶寬有關(guān)),費(fèi)時(shí)耗流量,用戶體驗(yàn)極其不好。后來(lái)網(wǎng)上搜優(yōu)化的方法,就是Http壓縮。
HTTP壓縮可以大大提高瀏覽網(wǎng)站的速度,它的原理是,在客戶端請(qǐng)求服務(wù)器對(duì)應(yīng)資源后,從服務(wù)器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負(fù)責(zé)解壓縮并瀏覽。即:通過(guò)減小HTTP響應(yīng)大小來(lái)減少響應(yīng)時(shí)間。相對(duì)于普通的瀏覽過(guò)程HTML ,CSS,Javascript , Text ,它可以節(jié)省40%左右的流量。更為重要的是,它可以對(duì)動(dòng)態(tài)生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網(wǎng)頁(yè)也能進(jìn)行壓縮,壓縮效率也很高。而GZIP本身就是一種網(wǎng)絡(luò)流壓縮算法,而且應(yīng)用相當(dāng)廣泛。本文是針對(duì)apache tomcat 8.0.47進(jìn)行配置GZIP壓縮的。瀏覽器使用Mozilla Firefox 35.0.1,調(diào)試用自帶的Firebug,以下和網(wǎng)絡(luò)有關(guān)的截圖來(lái)自Firebug控制臺(tái)。
二、Gzip壓縮簡(jiǎn)介
1. HTTP 協(xié)議支持GZIP 壓縮機(jī)制,也稱(chēng)協(xié)議壓縮。 HTTP GZIP壓縮是由WEB服務(wù)器和瀏覽器共同遵守的協(xié)議,也就是說(shuō)WEB服務(wù)器和瀏覽器都必須遵守。目前主流的服務(wù)器和瀏覽器都支持GZIP壓縮技術(shù)。包括 Chrome、IE、FireFox、Opera 等;服務(wù)器有 tomcat、Apache 和 IIS 等。
2. GZIP 主要用來(lái)壓縮html,css,javascript,等靜態(tài)文本文件,也支持對(duì)動(dòng)態(tài)生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網(wǎng)頁(yè)也能進(jìn)行壓縮。
3. GZIP 壓縮的比率通常在3~10 倍之間,這樣可以大大節(jié)省服務(wù)器的網(wǎng)絡(luò)帶寬,大大提升瀏覽器的瀏覽速度。
4. GZIP 是一種數(shù)據(jù)壓縮格式,默認(rèn)且目前僅使用deflate算法壓縮data部分;deflate是一種壓縮算法,是huffman編碼的一種加強(qiáng)。
5. 協(xié)議壓縮就是依據(jù)HTTP協(xié)議進(jìn)行壓縮,不需要程序員進(jìn)行壓縮,解壓編碼,而是把壓縮過(guò)程交給WEB服務(wù)器,將解壓過(guò)程交給客戶端。 如果客戶端為支持GZIP壓縮的瀏覽器,那么解壓過(guò)程也不需要程序員參與,瀏覽器會(huì)按照一定的規(guī)則自動(dòng)進(jìn)行解壓縮;如果客戶端為HttpClient ,那么就需要手動(dòng)進(jìn)行GZIP解碼了。
6. 壓縮過(guò)程:客戶端發(fā)送http請(qǐng)求,如果請(qǐng)求頭header中攜帶Accept-Encoding:gzip,deflate (現(xiàn)在的瀏覽器一般默認(rèn)都是這樣),那么瀏覽器的意思是:服務(wù)器需要進(jìn)行GZIP壓縮,再看響應(yīng)內(nèi)容的類(lèi)型是否滿足服務(wù)器配置的需要壓縮的類(lèi)型,如果符合,那么WEB服務(wù)器在傳輸響應(yīng)內(nèi)容之前,會(huì)對(duì)響應(yīng)內(nèi)容進(jìn)行壓縮,并在響應(yīng)頭中添加Content-Encoding gzip;如果不符合,那么將不壓縮,直接返回。
7. 解壓過(guò)程:(瀏覽器)客戶端接收到響應(yīng),如果響應(yīng)頭中包含Content-Encoding GZIP,那么瀏覽器會(huì)自動(dòng)將響應(yīng)內(nèi)容進(jìn)行GZIP解壓縮,然后再呈現(xiàn)在頁(yè)面上。如果不包含,那么將直接呈現(xiàn)在頁(yè)面上。
8.GZIP的缺點(diǎn)。相對(duì)于沒(méi)有進(jìn)行GZIP的工程來(lái)說(shuō),使用GZIP要增加服務(wù)器壓縮的壓力(cpu消耗)、客戶端解壓縮的壓力,故而對(duì)服務(wù)器的配置需求更高。另外壓縮也要耗費(fèi)時(shí)間,想占用更小的空間,得到高壓縮比率,肯定要犧牲較長(zhǎng)的時(shí)間;反之,如果時(shí)間較為寶貴,要求快速,那么所得的壓縮比率一定較小,當(dāng)然會(huì)占用更大的空間了(壓縮比率=原內(nèi)容大小/壓縮后大小,壓縮比率越大,則表明壓縮后占用空間的壓縮包越?。?,這就是物理空間與時(shí)間的矛盾。
三、tomcat中配置方法
版本要求:Tomcat5.0以上。 修改%TOMCAT_HOME%/conf/server.xml,修訂節(jié)點(diǎn)如下:
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,
application/javascript,text/css,text/plain,text/json"/>
參數(shù)說(shuō)明:
1、compression="on" 開(kāi)啟壓縮??蛇x值:"on"開(kāi)啟,"off"關(guān)閉,"force"任何情況都開(kāi)啟。
2、compressionMinSize="2048"大于2KB的文件才進(jìn)行壓縮。用于指定壓縮的最小數(shù)據(jù)大小,單位B,默認(rèn)2048B。注意此值的大小,如果配置不合理,產(chǎn)生的后果是小文件壓縮后反而變大了,達(dá)不到預(yù)想的效果。
3、noCompressionUserAgents="gozilla, traviata",對(duì)于這兩種瀏覽器,不進(jìn)行壓縮(我也不知道這兩種瀏覽器是啥,百度上沒(méi)找到),其值為正則表達(dá)式,匹配的UA將不會(huì)被壓縮,默認(rèn)空。
4、compressableMimeType="text/html,text/xml,application/javascript,text/css,text/plain,text/json"會(huì)被壓縮的MIME類(lèi)型列表,多個(gè)逗號(hào)隔,表明支持html、xml、js、css、json等文件格式的壓縮(plain為無(wú)格式的,但對(duì)于具體是什么,我比較概念模糊)。compressableMimeType很重要,它用來(lái)告知tomcat要對(duì)哪一種文件進(jìn)行壓縮,如果類(lèi)型指定錯(cuò)誤了,肯定是無(wú)法壓縮的。那么,如何知道要壓縮的文件類(lèi)型呢?可以通過(guò)以下這種方法找到。
四、檢查配置是否成功
修改完之后重啟下tomcat即可,最后去檢測(cè)網(wǎng)站:http://seo.chinaz.com/?host=iitshare.com查詢(xún)下效果
五、常見(jiàn)錯(cuò)誤(配置后沒(méi)效果)
可通過(guò)以下步驟排查:
1、tomcat中的配置參數(shù)寫(xiě)錯(cuò)位置了。注意配置參數(shù)應(yīng)該寫(xiě)到下圖中A區(qū)而不是B區(qū),就是protocol="HTTP/1.1"那個(gè)Connector中。
2、響應(yīng)數(shù)據(jù)不是compressableMimeType參數(shù)配置的類(lèi)型。我就遇到了這個(gè)坑,我們項(xiàng)目前后端傳輸用的是json。所以我最開(kāi)始以為是“text/json”,后來(lái)打開(kāi)Firebug的控制臺(tái),原來(lái)Content-Type的值是“application/json”。見(jiàn)圖三。
3、響應(yīng)數(shù)據(jù)的大小小于compressionMinSize的配置值。
附:優(yōu)化結(jié)果
可以看到 壓縮比率 = 65.6 / 8.4 = 7.810, 時(shí)間比率 = 96 / 16.2 = 5.926,已經(jīng)是很理想了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。