Gzip压缩
Nginx Gzip 压缩配置详解:提升传输效率的实战指南
Gzip 压缩是优化 Web 性能的关键手段,通过对响应数据(如 HTML、CSS、JS)进行实时压缩,减少网络传输量,提升页面加载时间。Nginx 内置 Gzip 模块,可通过简单配置实现高效压缩。本文详细讲解 Gzip 的核心参数、配置方法及最佳实践,帮助最大化压缩效率。
Gzip 压缩原理与优势
- 原理:Nginx 在向客户端发送响应前,对符合条件的文件(如文本类资源)进行 Gzip 压缩,客户端接收后自动解压(现代浏览器均支持);
- 优势:
- 减少传输数据量(通常压缩率可达 50%-70%);
- 降低带宽消耗,提升页面加载速度;
- 尤其适合文本类资源(HTML、CSS、JS),对图片(已压缩格式如 JPG/PNG)效果有限。
核心配置参数详解
Nginx 的 Gzip 配置主要通过gzip及相关指令实现,常用参数如下:
| 指令 | 作用 | 推荐值 |
|---|---|---|
gzip |
开启 / 关闭 Gzip 压缩 | on(开启) |
gzip_comp_level |
压缩级别(1-9,级别越高压缩率越高但 CPU 消耗越大) | 2-4(平衡压缩率与性能) |
gzip_min_length |
最小压缩文件大小(小于该值的文件不压缩,避免反增体积) | 1k(1024 字节) |
gzip_buffers |
压缩缓存空间(个数 × 大小) | 16 8k(16 个缓存块,每个 8k) |
gzip_types |
指定需要压缩的 MIME 类型(文件类型) | text/plain text/css application/javascript ... |
gzip_vary |
向响应头添加Vary: Accept-Encoding,告知代理服务器缓存压缩 / 非压缩版本 |
on |
gzip_proxied |
对代理后端返回的数据是否压缩(如反向代理场景) | any(无条件压缩) |
gzip_static |
优先使用预压缩的.gz文件(如index.html.gz),减少实时压缩开销 |
on |
基础配置示例
以下是通用的 Gzip 配置,适用于大多数 Web 服务:
http {
# 开启Gzip压缩
gzip on;
# 压缩级别(2-4为宜,平衡性能与压缩率)
gzip_comp_level 3;
# 最小压缩文件大小(小于1k的文件不压缩)
gzip_min_length 1024;
# 压缩缓存(16个8k块,共128k)
gzip_buffers 16 8k;
# 支持的HTTP版本(默认1.1,兼容主流浏览器)
gzip_http_version 1.1;
# 需要压缩的文件类型(文本类为主)
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/x-javascript
application/xml
application/json
text/json
image/svg+xml;
# 告知代理服务器缓存压缩/非压缩版本
gzip_vary on;
# 对代理后端的响应也进行压缩
gzip_proxied any;
# 开启预压缩文件支持(优先使用已压缩的.gz文件)
gzip_static on;
# 其他配置...
server {
listen 80;
server_name example.com;
root /var/www/html;
}
}
针对性优化配置
1. 静态资源压缩(HTML/CSS/JS)
文本类资源压缩收益最高,可单独配置强化:
location ~* \.(html|css|js|json|xml|svg)$ {
gzip on;
gzip_comp_level 4; # 适当提高压缩级别(文本压缩成本低)
gzip_min_length 512; # smaller文本也压缩
gzip_types text/html text/css application/javascript application/json image/svg+xml;
}
2. 图片资源:谨慎压缩
JPG、PNG、WebP 等图片本身已压缩,Gzip 压缩效果有限(甚至可能增大体积),建议排除或仅压缩未优化的图片:
# 对未压缩的图片格式(如BMP)进行压缩,跳过已压缩格式
location ~* \.(bmp)$ {
gzip on;
gzip_comp_level 2; # 低级别压缩(避免浪费CPU)
gzip_types image/bmp;
}
# 对已压缩图片不启用Gzip
location ~* \.(jpg|jpeg|png|gif|webp)$ {
gzip off;
}
3. 预压缩文件(gzip_static)
对于访问频繁的静态资源(如 JS 库、CSS 框架),可预先生成.gz压缩文件,减少 Nginx 实时压缩的 CPU 消耗:
步骤 1:手动压缩文件(如
index.js→index.js.gz):gzip -k -6 /var/www/html/js/index.js # -k保留原文件,-6压缩级别步骤 2:配置
gzip_static自动使用预压缩文件:location ~* \.(js|css)$ { gzip_static on; # 优先使用.gz文件 gzip_proxied expired no-cache no-store private auth; expires 1d; # 配合客户端缓存 }- 效果:客户端请求
index.js时,Nginx 直接返回index.js.gz(若存在且客户端支持 Gzip)。
- 效果:客户端请求
注意事项与最佳实践
避免过度压缩:
- 压缩级别
gzip_comp_level建议设为 2-4(级别越高,CPU 消耗呈指数增长,而压缩率提升有限); - 小文件(如 < 1k)不压缩(压缩后可能比原文件大,且浪费 CPU)。
- 压缩级别
动态内容压缩:
- 对动态生成的内容(如 PHP/JSP 输出),确保
gzip_proxied any开启,避免后端未压缩时 Nginx 也不处理。
- 对动态生成的内容(如 PHP/JSP 输出),确保
测试压缩效果:
使用curl验证响应头是否包含Content-Encoding: gzip:
curl -I -H "Accept-Encoding: gzip" http://example.com/index.css若返回
Content-Encoding: gzip,说明压缩生效。
兼容性处理:
老版本浏览器(如 IE6)对 Gzip 支持不佳,可通过if条件排除:
if ($http_user_agent ~* "MSIE [1-6]\.") { gzip off; }
常见问题排查
- 压缩未生效:
- 检查
gzip on是否开启; - 确认文件类型在
gzip_types中; - 检查文件大小是否超过
gzip_min_length。
- 检查
- 压缩后体积变大:
- 小文件(<1k)关闭压缩;
- 已压缩格式(如 JPG、PNG)关闭压缩。
- CPU 占用过高:
- 降低
gzip_comp_level; - 启用
gzip_static,使用预压缩文件
- 降低