Nginx Gzip压缩 #

一、压缩概述 #

1.1 为什么需要压缩 #

HTTP压缩可以显著减少传输数据量,提升网站加载速度:

  • 减少带宽消耗
  • 降低传输时间
  • 提升用户体验
  • 节省流量成本

1.2 压缩算法对比 #

算法 压缩率 压缩速度 浏览器支持
Gzip 中等 广泛
Brotli 中等 较新
Deflate 广泛

二、Gzip基本配置 #

2.1 最简配置 #

nginx
http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
}

2.2 完整配置 #

nginx
http {
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_min_length 1000;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/json
        application/javascript
        application/xml
        application/xml+rss
        application/atom+xml
        image/svg+xml
        application/x-javascript;
    gzip_disable "msie6";
}

三、Gzip参数详解 #

3.1 gzip #

nginx
gzip on;
gzip off;

3.2 gzip_comp_level #

压缩级别,1-9,级别越高压缩率越高但CPU消耗越大:

nginx
gzip_comp_level 1;
gzip_comp_level 6;
gzip_comp_level 9;
级别 压缩率 CPU消耗 推荐场景
1 CPU受限
4-6 一般场景
7-9 静态文件

3.3 gzip_min_length #

最小压缩大小,小于此值不压缩:

nginx
gzip_min_length 1000;
gzip_min_length 1k;

3.4 gzip_types #

压缩的MIME类型:

nginx
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
gzip_types *;

默认只压缩 text/html

3.5 gzip_vary #

添加Vary头,告诉代理服务器根据Accept-Encoding缓存不同版本:

nginx
gzip_vary on;

3.6 gzip_proxied #

代理请求压缩策略:

nginx
gzip_proxied off;
gzip_proxied expired;
gzip_proxied no-cache;
gzip_proxied no-store;
gzip_proxied private;
gzip_proxied no_last_modified;
gzip_proxied no_etag;
gzip_proxied auth;
gzip_proxied any;
说明
off 不压缩代理请求
expired 压缩带Expires头的请求
no-cache 压缩带Cache-Control: no-cache的请求
any 压缩所有代理请求

3.7 gzip_buffers #

压缩缓冲区:

nginx
gzip_buffers 16 8k;
gzip_buffers 32 4k;

3.8 gzip_disable #

禁用特定User-Agent的压缩:

nginx
gzip_disable "msie6";
gzip_disable "MSIE [4-6]\.";
gzip_disable "~*MSIE [1-6]\.";

3.9 gzip_http_version #

支持的HTTP版本:

nginx
gzip_http_version 1.0;
gzip_http_version 1.1;

四、压缩效果测试 #

4.1 使用curl测试 #

bash
curl -H "Accept-Encoding: gzip" -I https://example.com

查看响应头:

text
Content-Encoding: gzip
Vary: Accept-Encoding

4.2 比较压缩前后大小 #

bash
curl -s https://example.com | wc -c
curl -s -H "Accept-Encoding: gzip" https://example.com | wc -c

4.3 在线测试工具 #

五、预压缩文件 #

5.1 预压缩配置 #

nginx
location /static/ {
    gzip_static on;
    gzip_proxied any;
}

5.2 生成预压缩文件 #

bash
gzip -k -9 /var/www/static/main.js
gzip -k -9 /var/www/static/main.css

生成 main.js.gzmain.css.gz

5.3 gzip_static参数 #

nginx
gzip_static on;
gzip_static off;
gzip_static always;
说明
on 优先使用预压缩文件
off 不使用预压缩文件
always 始终使用预压缩文件

5.4 构建时生成预压缩 #

Webpack配置:

javascript
const CompressionPlugin = require('compression-webpack-plugin');

module.exports = {
    plugins: [
        new CompressionPlugin({
            algorithm: 'gzip',
            test: /\.(js|css|html|svg)$/,
            threshold: 10240,
            minRatio: 0.8
        })
    ]
};

六、Brotli压缩 #

6.1 安装Brotli模块 #

bash
sudo apt install libnginx-mod-http-brotli

或编译安装:

bash
./configure --add-module=/path/to/ngx_brotli
make && make install

6.2 Brotli配置 #

nginx
http {
    brotli on;
    brotli_comp_level 6;
    brotli_min_length 1000;
    brotli_types text/plain text/css application/json application/javascript text/xml application/xml;
    brotli_buffers 16 8k;
}

6.3 Brotli参数 #

参数 说明
brotli 启用/禁用
brotli_comp_level 压缩级别(0-11)
brotli_min_length 最小压缩大小
brotli_types 压缩类型
brotli_buffers 缓冲区

6.4 预压缩Brotli #

nginx
location /static/ {
    brotli_static on;
}

6.5 Gzip与Brotli同时配置 #

nginx
http {
    gzip on;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript;
    
    brotli on;
    brotli_comp_level 6;
    brotli_types text/plain text/css application/json application/javascript;
}

Nginx会根据客户端Accept-Encoding自动选择。

七、压缩策略 #

7.1 静态资源压缩 #

nginx
location /static/ {
    alias /var/www/static/;
    
    gzip_static on;
    brotli_static on;
    
    gzip on;
    gzip_types text/plain text/css application/javascript application/json;
    
    brotli on;
    brotli_types text/plain text/css application/javascript application/json;
}

7.2 动态内容压缩 #

nginx
location /api/ {
    proxy_pass http://backend;
    
    gzip on;
    gzip_comp_level 4;
    gzip_min_length 1000;
    gzip_types application/json;
    gzip_vary on;
}

7.3 图片压缩 #

图片通常已经是压缩格式,不建议再压缩:

nginx
location ~* \.(jpg|jpeg|png|gif|ico|webp)$ {
    gzip off;
    brotli off;
}

7.4 大文件压缩 #

nginx
location /download/ {
    alias /var/www/download/;
    
    gzip on;
    gzip_comp_level 4;
    gzip_min_length 10k;
    gzip_types application/octet-stream;
}

八、压缩与缓存 #

8.1 Vary头配置 #

nginx
location / {
    gzip on;
    gzip_vary on;
    
    proxy_cache my_cache;
    proxy_cache_key "$scheme$request_method$host$request_uri$http_accept_encoding";
}

8.2 分离缓存 #

nginx
map $http_accept_encoding $suffix {
    default "";
    "~*gzip" ".gz";
    "~*br" ".br";
}

location /static/ {
    alias /var/www/static/;
    try_files "${uri}${suffix}" $uri =404;
}

九、性能优化 #

9.1 压缩级别选择 #

nginx
map $sent_http_content_type $gzip_level {
    default 6;
    "text/html" 6;
    "text/css" 6;
    "application/javascript" 6;
    "application/json" 4;
    "image/svg+xml" 9;
}

gzip_comp_level $gzip_level;

9.2 条件压缩 #

nginx
map $request_uri $no_gzip {
    default 0;
    "~*\.(jpg|jpeg|png|gif|ico|webp|mp4|mp3|pdf|zip)$" 1;
}

gzip on;
gzip_if $no_gzip = 0;

9.3 CPU优化 #

nginx
worker_processes auto;
worker_cpu_affinity auto;

gzip on;
gzip_comp_level 4;
gzip_buffers 16 8k;

十、调试与监控 #

10.1 查看压缩状态 #

nginx
add_header X-Gzip-Status $gzip_ratio;

10.2 日志记录压缩比 #

nginx
log_format compression '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $body_bytes_sent '
                       'gzip_ratio=$gzip_ratio';

access_log /var/log/nginx/compression.log compression;

10.3 监控压缩效果 #

bash
awk -F'gzip_ratio=' '{print $2}' /var/log/nginx/compression.log | sort -n | uniq -c

十一、常见问题 #

11.1 压缩不生效 #

检查项:

  1. gzip是否开启
  2. Content-Type是否在gzip_types中
  3. 文件大小是否超过gzip_min_length
  4. 客户端是否发送Accept-Encoding头

11.2 压缩导致乱码 #

原因: 后端已经压缩,Nginx再次压缩

解决:

nginx
gzip_proxied no-transform;
proxy_set_header Accept-Encoding "";

11.3 内存不足 #

解决: 调整gzip_buffers

nginx
gzip_buffers 4 16k;

十二、完整配置示例 #

nginx
http {
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_min_length 1000;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_disable "msie6";
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/json
        application/javascript
        application/xml
        application/xml+rss
        application/atom+xml
        image/svg+xml
        application/x-font-ttf
        font/opentype;
    
    brotli on;
    brotli_vary on;
    brotli_comp_level 6;
    brotli_min_length 1000;
    brotli_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/json
        application/javascript
        application/xml;
    
    server {
        listen 80;
        server_name example.com;
        
        location / {
            root /var/www/html;
            index index.html;
        }
        
        location /static/ {
            alias /var/www/static/;
            
            gzip_static on;
            brotli_static on;
            
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
        
        location /api/ {
            proxy_pass http://backend;
            
            gzip_comp_level 4;
            gzip_types application/json;
        }
        
        location ~* \.(jpg|jpeg|png|gif|ico|webp|mp4|mp3|pdf|zip)$ {
            gzip off;
            brotli off;
        }
    }
}

十三、总结 #

本章我们学习了:

  1. 压缩原理:减少传输数据量
  2. Gzip配置:完整参数详解
  3. 预压缩:gzip_static使用
  4. Brotli压缩:更高效的压缩算法
  5. 压缩策略:不同场景的配置
  6. 性能优化:压缩级别和CPU优化
  7. 调试监控:查看压缩效果

掌握Gzip压缩后,让我们进入下一章,学习访问控制!

最后更新:2026-03-27