忘記是第幾次讀《高性能網(wǎng)站建設(shè)指南》的“規(guī)則4──緊縮組件”1章了,之前1直弄得渾渾噩噩,今天才恍然有所覺悟,原來通過減小HTTP響應(yīng)大小來減少響應(yīng)時(shí)間利用到tomcat服務(wù)器上是這么1回事,結(jié)果使人欣慰萬分,同時(shí)令我感到慚愧。gzip緊縮率高達(dá)70%左右,這對(duì)提升web性能來講簡(jiǎn)直就是逆天的表現(xiàn),而今天之前的我,卻不曾知曉!想必很多大牛都已不屑于整理這樣的資料,但是對(duì)我來講,“像張白紙,愛情才剛剛開始,我要寫的字太多!”
對(duì)js、css、html3種經(jīng)常使用的類型,緊縮率高的讓人欣喜。拿html來講,47.49KB的大小gzip后為5.32KB,明顯會(huì)大幅度提升網(wǎng)絡(luò)的傳輸速度,固然,相對(duì)沒有進(jìn)行g(shù)zip的工程來講,使用gzip要增加服務(wù)器緊縮的壓力(cpu消耗)、客戶端解緊縮的壓力,具體消耗性能的提升和消耗之間的“能量轉(zhuǎn)換比”有多少,我暫時(shí)沒法得知,不過你如果感興趣的話,可以看看主流網(wǎng)站(百度)是不是采取了gzip。
gzip工作的原理很簡(jiǎn)單,通過http要求header增加1個(gè)“Accept-Encoding:gzip”指令來告知服務(wù)器需要進(jìn)行g(shù)zip緊縮,而服務(wù)器接收到該要求后,通過“Content-Encoding:gzip”來告知客戶端進(jìn)行g(shù)zip解壓。
gzip要求指令的發(fā)送仿佛(這1點(diǎn),我還沒有弄清楚)是默許的,打開火狐的firebug進(jìn)行視察,可以看到要求的header中均包括了“Accept-Encoding:gzip, deflate(沒有g(shù)zip高效,且不流行的緊縮)”的指令。
要求不需要設(shè)置,但相應(yīng)是要經(jīng)過設(shè)置的,對(duì)tomcat服務(wù)器,找到的方法以下:
<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF⑻"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,application/javascript,text/css,text/plain,text/json"/>
在tomcat的server.xml中對(duì)connector進(jìn)行如上配置:
compression="on"
開啟緊縮compressionMinSize="2048"
大于2KB的文件才進(jìn)行緊縮(《高性能網(wǎng)站建設(shè)指南》建議1KB或2KB以上,緣由不得而知)noCompressionUserAgents="gozilla, traviata"
,對(duì)這兩種閱讀器,不進(jìn)行緊縮(我也不知道這兩種閱讀器是啥,百度上沒找到)compressableMimeType="text/html,text/xml,application/javascript,text/css,text/plain,text/json"
表明支持html、xml、js、css、json等文件格式的緊縮(plain為無格式的,但對(duì)具體是甚么,我比較概念模糊)。然后重啟tomcat。
目前我知道的,有兩種做法:
《高性能網(wǎng)站建設(shè)指南》的“規(guī)則4──緊縮組件”1章中最后,還提到了“邊沿情形”的1些問題(具體問題就我就不羅嗦了),解決辦法之1是
Cache-Control: private頭來禁用代理緩存。
喏,來看看怎樣設(shè)置吧(來源于stackoverflow)!
package com.honzh.common.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
public class CacheControlFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
HttpServletResponse resp = (HttpServletResponse) response;
// resp.setHeader("Expires", "Tue, 03 Jul 2001 06:00:00 GMT");
// resp.setDateHeader("Last-Modified", new Date().getTime());
// resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0");
resp.setHeader("Cache-Control", "max-age=0, private");
// resp.setHeader("Pragma", "no-cache");
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
<filter>
<filter-name>cacheControlFilter</filter-name>
<filter-class>com.honzh.common.filter.CacheControlFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cacheControlFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
經(jīng)過這樣1個(gè)小動(dòng)作的優(yōu)化,來縱情享受web性能提升后的快感吧!