Gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台。当使用gzip压缩后可以使需要加载的文件大小缩小到原来的1/4左右(最大压缩级别),效果是非常明显的。利用Apache中的Gzip模块,我们可以使用Gzip压缩算法来对Apache服务器发布的网页内容进行压缩后再传输到客户端浏览器,这样经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。
网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处是Gzip与搜索引擎的抓取工具有着更好的关系。例如 Google就可以通过直接读取gzip文件来比普通手工抓取更快地检索网页。在Google网站管理员工具(Google Webmaster Tools)中你可以看到,sitemap.xml.gz 是直接作为Sitemap被提交的。而这些好处并不仅仅限于静态内容,PHP动态页面和其他动态生成的内容均可以通过使用Apache压缩模块压缩,加上其他的性能调整机制和相应的服务器端 缓存规则,这可以大大提高网站的性能。因此,对于部署在Linux服务器上的PHP程序,在服务器支持的情况下,我们建议你开启使用Gzip Web压缩。
举个示例:
假设你要请求一个100k的文件,网络传输速度为 50k/s,需要 2s 才能得到数据,但是如果在服务器设置了 gzip 压缩,将服务端的文件压缩到了50k(实际上的压缩率往往小于 50%),这时候只需 1s 就能得到数据,然后客户端浏览器会自动解压,最终再将其展示给用户。
1、web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩(Accept-Encoding 信息);
2、如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;
3、如果请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;
4、如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;
5、如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;
6、如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。
1、修改Apache的http.conf文件,去除mod_deflate.so前面的“#”号注释:
LoadModule deflate_module modules/mod_deflate.so
接着在http.conf最末尾添加gzip压缩配置的代码:
# GZIP压缩模块配置
# 告诉apache对传输到浏览器的内容进行压缩
SetOutputFilter DEFLATE
# 压缩等级 9
DeflateCompressionLevel 9
# 设置不对后缀gif,jpg,jpeg,png,exe等文件进行压缩
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|exe|t?gz|zip|bz2|sit|rar|pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
# 压缩类型 html、xml、php、css、js
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php text/css application/x-javascript
AddOutputFilter DEFLATE js css
里面的文件MIME类型可以根据自己情况添加,至于PDF 、图片、音乐文档之类的这些文件本身都已经高度压缩格式,重复压缩的作用不大,反而可能会因为增加CPU的处理时间及浏览器的渲染问题而降低性能。所以就没必要对其进行Gzip压缩。
2、对指定的文件配置缓存的生存时间,去除mod_headers.so模块前面的“#”号注释:
LoadModule headers_module modules/mod_headers.so
接着在http.conf最末尾添加文件缓存时间配置的代码:
# 文件缓存时间配置
Header set Cache-Control "max-age=2592000"
3、配置完成后,重启Apache服务即可。
如果在http.conf末尾添加Gzip压缩配置,且重启Apache服务后,发现服务无法正常启动,就用我这个方法:
1、查看Apache安装目录下conf/extra/下,是不是有一个httpd-deflate.conf文件
2、在http.conf添加对httpd-deflate.conf文件的引用,代码如下:
# 引用GZIP压缩模块配置文件
#Include conf/extra/httpd-deflate.conf
3、修改httpd-deflate.conf里的配置代码,如下:
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog logs/deflate.log deflate
# 压缩类型 html、xml、php、css、js
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php text/css application/x-javascript
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Don't compress images
# 设置不对后缀gif,jpg,jpeg,png,exe等文件进行压缩
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png|exe|t?gz|zip|bz2|sit|rar|pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
1、使用谷歌浏览器访问网站,然后按F12(调试模式)→ Network → 刷新页面
2、右侧文件栏里,找到主页面文件 → 右键 → Header Options → Response Headers → 勾选 Content-Encoding
3、然后重新刷新页面,查看 Header头信息,就可以看到是否已经gip压缩了