Nginx之gzip压缩和解压

一、概述

Nginx是一款高性能的Web服务器,它也能够充当反向代理服务器和负载均衡器。在Web应用开发中,优化网站速度是一个非常重要的工作。使用gzip压缩和解压缩技术,可以有效减小传输文件的大小,提升网站的访问速度。

二、开启gzip压缩

首先,需要在Nginx的配置文件中开启gzip压缩。通常,Nginx的配置文件位于/etc/nginx/nginx.conf

打开配置文件,并找到http模块下的gzip配置项,如下所示:

http {
    # 开启gzip压缩
    gzip on;

    # 排除不支持 gzip 的浏览器(如 IE6)
    gzip_disable "msie6";

    # 指定压缩的文件类型(必须显式声明,否则不压缩)
    gzip_types 
        text/plain              # 纯文本
        text/css                # CSS 样式
        application/javascript; # JS 脚本

    # ...  
}
  • gzip on:表示开启gzip压缩功能。
  • gzip_disable "msie6":表示禁用对msie6浏览器的gzip压缩功能,因为该浏览器对gzip压缩的支持存在问题。
  • gzip_types:指定需要进行gzip压缩的文件类型。

三、常用配置

3.1 配置gzip压缩级别

示例配置如下:

http {
    # 开启gzip压缩
    gzip on;

    # 排除不支持gzip的浏览器(如IE6)
    gzip_disable "msie6";

    # 指定压缩的文件类型(必须显式声明,否则不压缩)
    gzip_types 
        text/plain              # 纯文本
        text/css                # CSS 样式
        application/javascript; # JS 脚本

    # 压缩级别(1-9,级别越高压缩率越高,CPU消耗越大,推荐6)
    gzip_comp_level 6;
    
    # ...
}

在上述gzip配置项下添加gzip_comp_level配置项,它表示gzip压缩的级别。级别范围从19,数字越大压缩率越高,但同时也会增加压缩的时间。

在上述配置中,gzip_comp_level被设置为6,表示gzip压缩的级别。

3.2 配置gzip压缩缓冲区大小

示例配置如下:

http {
    # 开启gzip压缩
    gzip on;

    # 排除不支持gzip的浏览器(如IE6)
    gzip_disable "msie6";

    # 指定压缩的文件类型(必须显式声明,否则不压缩)
    gzip_types 
        text/plain              # 纯文本
        text/css                # CSS 样式
        application/javascript; # JS 脚本

    # 压缩级别(1-9,级别越高压缩率越高,CPU消耗越大,推荐6)
    gzip_comp_level 6;

    # 压缩缓冲区(用于临时存储压缩数据,16个8k缓冲区)
    gzip_buffers 16 8k;

    #...
}

在上述gzip配置项下添加gzip_buffers配置项,表示压缩缓冲区的大小。默认情况下,Nginx会根据响应内容自动分配压缩缓冲区。但是,如果您对压缩缓冲区的大小有特殊要求,可以进行配置。

在上述配置中,gzip_buffers被设置为16 8k,表示分配168k大小的压缩缓冲区。

3.3 配置gzip压缩最小文件大小

示例配置如下:

http {
    # 开启gzip压缩
    gzip on;

    # 排除不支持gzip的浏览器(如IE6)
    gzip_disable "msie6";

    # 指定压缩的文件类型(必须显式声明,否则不压缩)
    gzip_types 
        text/plain              # 纯文本
        text/css                # CSS 样式
        application/javascript; # JS 脚本

    # 压缩级别(1-9,级别越高压缩率越高,CPU消耗越大,推荐6)
    gzip_comp_level 6;

    # 压缩缓冲区(用于临时存储压缩数据,16个8k缓冲区)
    gzip_buffers 16 8k;

    # 最小压缩文件大小(小于此值的文件不压缩,避免反增体积,单位:字节)
    gzip_min_length 256;

    #...
}

在上述gzip配置项下添加gzip_min_length配置项,表示进行gzip压缩的最小文件大小。只有当文件大小超过该值时,才会进行gzip压缩。

在上述配置中,gzip_min_length被设置为256,表示文件大小超过256字节才会进行gzip压缩。

四、动态内容压缩

Nginx不仅能压缩静态文件(如JSCSS),还能对动态生成的内容(如PHPNode.js输出)启用压缩。关键配置:

location / {
    # 对动态代理的响应启用压缩(如反向代理后端服务时)
    gzip_proxied any;  # 对代理请求的响应启用压缩
    
    # 指定压缩的文件类型(必须显式声明,否则不压缩)
    gzip_types
        application/json
        application/xml;  # 补充动态内容的MIME类型

    #...
}

适用场景

  • API接口返回的JSON/XML数据
  • 动态渲染的HTML页面
  • 注意:需确保后端服务未提前压缩内容,避免重复压缩

五、完整配置示例

经过以上配置后,Nginx会自动对客户端请求的合适文件进行gzip压缩。当客户端请求的文件被gzip压缩后,Nginx会自动添加"Content-Encoding: gzip"的响应头,同时会对响应内容进行解压缩。

实际上,Nginx不仅可以对文件进行gzip压缩和解压缩,还可以对动态生成的响应内容进行gzip压缩。对于动态生成的响应内容,可以通过设置相关的页面编码头实现gzip压缩,如下所示:

http {
    # 开启gzip压缩
    gzip on;

    # 排除不支持 gzip 的浏览器(如 IE6)
    gzip_disable "msie6";

    # 压缩级别(1-9,级别越高压缩率越高,CPU 消耗越大,推荐 6)
    gzip_comp_level 6;

    # 压缩缓冲区(用于临时存储压缩数据,16个8k缓冲区)
    gzip_buffers 16 8k;

    # 最小压缩文件大小(小于此值的文件不压缩,避免反增体积,单位:字节)
    gzip_min_length 256;

    # 指定压缩的文件类型(必须显式声明,否则不压缩)
    gzip_types 
        text/plain 
        text/css 
        text/javascript 
        application/javascript 
        application/json 
        application/xml 
        text/html;
    
    # 动态内容压缩(按需添加)
    location /api {
        # 对动态代理的响应启用压缩(如反向代理后端服务时)
        gzip_proxied any;

        #...
    }
}

配置生效与验证:

  1. 重启Nginx:systemctl restart nginx
  2. 验证方法:用curl -I -H "Accept-Encoding: gzip" https://你的域名/index.css,若响应头包含Content-Encoding: gzip则表示配置生效

六、总结

通过合理配置Nginx Gzip,文本类资源的传输体积可减少60%~80%,尤其对移动端用户和低带宽环境友好。记得根据服务器硬件性能和业务场景微调参数,在压缩效果与CPU消耗间找到最佳平衡点。

posted @ 2023-08-22 14:39  夏尔_717  阅读(1280)  评论(0)    收藏  举报