如何在Httpd服务器上启动gzip压缩

-- TOC --

本文介绍如何在Httpd服务器上,启动gzip压缩功能。

启动gzip压缩的考虑

gzip压缩功能的作用,是对Httpd服务器回应客户端的内容,先进行压缩处理,然后再发送给客户端。显然,好处是压缩之后,网络带宽占用会变小,但是服务器CPU的使用率会提高,而且Httpd服务器从收到请求和完成应答的时延也会增大。

不过,开启gzip压缩似乎是很主流的做法,似乎带宽的成本要比CPU的成本高!另一个原因,可能是压缩后,数据包在网络中的传输会更快,反而会降低时延,提高响应速度。

网页gzip压缩流程

  1. 浏览器发送Http request给Web服务器, request中有Accept-Encoding: gzip, deflate。 (告诉服务器, 浏览器支持gzip压缩)
  2. Web服务器接到request后,生成原始的Response,其中有原始的Content-Type和Content-Length。
  3. Web服务器通过Gzip,来对Response进行编码, 编码后header中的Content-Type和Content-Length为压缩后的大小, 并且增加了Content-Encoding:gzip,然后把Response发送给客户端的浏览器。
  4. 浏览器接到Response后,根据Content-Encoding:gzip来对Response进行解码。 获取到原始response后,然后显示出网页。

如何开启gzip

首先在httpd.conf配置文件中,打开如下3个module:

LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule filter_module modules/mod_filter.so

为什么是mod_deflate?因为gzip使用deflate算法进行压缩。

Httpd到2.4之后,开启gzip需要打开LoadModule filter_module modules/mod_filter.so这个模块,网络上现有的教程全部都是没有这个说明的。如果不打开这个模块,apache无法启动,出现AddOutputFilterByType的语法错误。

然后需要增加如下一些配置,说明以注释的形式提供:

<IfModule deflate_module>
    # 打开压缩功能
    SetOutputFilter DEFLATE  
    # 可选,配置gzip压缩级别,9最高,1最低,一般保持默认6
    DeflateCompressionLevel 9  
    # 对.gif,.jpg,.jpeg,.png这几类图片文件,不做压缩
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    # 设置要压缩的MIME类型
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
<IfModule/>

根据你网站存放的文件类型,还可以增加不压缩的范围,或者增加要压缩的范围。

配置修改完后,记得重启生效!

检查gzip是否生效

简单的检查办法,就是查看服务器的response内容,很有多方式可以查看response,这里用firefox举例说明:

在firefox中打开Network调试界面,然后刷新你要查看的网页,网页打开后,选择你要查看的File资源,这时就能看到服务器的response内容:

content_encoding

看到有Content-Encoding: gzip,就表示服务器配置成功了!

未解决的问题

完全可以通过在服务器端,预先将静态资源做压缩,而不是等到HTTP请求到来的时候再压,这样响应速度和网络带宽占用都能改善。

但,应该如何配置?

本文链接:https://cs.pynote.net/net/httpd/202110016/

-- EOF --

-- MORE --