Nginx gzip压缩调优,文本、json
Nginx 开启 gzip 压缩后,浏览器下载 HTML、JSON、CSS 等文本资源的体积能减少 60% 以上,而图片这类本身已经压缩过的文件却不需要再压。
本文会带你完成文本、JSON、HTML 的压缩开启,同时让图片跳过 gzip,并提供验证方法和常见避坑点。
Nginx gzip 压缩适合处理哪些资源
gzip 的核心原理是在服务端对响应内容压缩,再交给浏览器解压展示。
对于含有大量重复字符的文本类资源,压缩效果非常明显,例如普通网页 HTML、接口返回的 JSON、CSS、JavaScript。
这些资源往往体积不大但加载频率高,开启 gzip 后能显著减少带宽占用和首屏等待时间。
图片则完全不同。
JPG、PNG、WebP 这类格式在生成时已经做了针对性压缩,如果再用 gzip 处理,体积不会明显变小,反而会让服务器消耗额外的 CPU 去反复压缩。
所以业界普遍做法是文本开压缩、图片跳过。
开启 gzip 前先确认两件事
第一,确认 Nginx 已安装 ngx_http_gzip_module 模块。
默认官方源安装的 Nginx 都自带这个模块,不用担心。
可以用下面命令查看:
nginx -V 2>&1 | grep http_gzip_module
第二,找到 Nginx 的主配置文件。
通常是 /etc/nginx/nginx.conf,或者被拆分的 /etc/nginx/conf.d/ 下的站点配置。
如果你用的是宝塔面板,可以在“网站-设置-配置文件”里看到当前站点的 Nginx 配置。
文本、JSON、HTML 开启 gzip 的配置示例
在 Nginx 配置文件的 http 块(如果只在单个站点生效,放在 server 块也可以)中添加以下配置:
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_vary on;
gzip_types text/plain text/css application/json application/javascript application/xml image/svg+xml;
各项参数说明如下:
gzip on:开启压缩功能。gzip_comp_level 5:压缩级别,范围 1-9。级别越高压缩率越大,但 CPU 消耗也越高。生产环境推荐 5,兼顾效果和性能。gzip_min_length 1k:只有响应体大于 1KB 才压缩,避免压缩过小文件浪费 CPU。gzip_vary on:让响应头带上Vary: Accept-Encoding,方便缓存服务器正确处理。gzip_types:声明需要压缩的 MIME 类型。这里包含了纯文本、CSS、JSON、JavaScript、XML 和 SVG。其中text/html默认就会压缩,所以不用额外列出。
修改完成后,先测试配置语法再重载:
nginx -t
nginx -s reload
如果输出 syntax is ok 就说明配置没有问题。
为什么图片要跳过 gzip 压缩
图片不加入 gzip_types 列表,就是让 Nginx 不压缩图片。
有朋友会问:如果用户请求的是 JPG,Nginx 会强行压缩吗?
不会,gzip_types 里没有声明 image/jpeg、image/png,Nginx 就不会对这类响应启用 gzip。
强行压缩图片不仅体积改善极小,还会让服务器多做无用功。
尤其是图片很多、访问量又大的站点,关闭图片压缩能省下不少 CPU。
如果你后续发现图片响应头里出现了 Content-Encoding: gzip,说明配置中混入了图片类型,需要立即移除。
配置后如何验证压缩是否生效
打开终端,用 curl 带 Accept-Encoding 发起请求,看响应头:
curl -I -H "Accept-Encoding: gzip" https://你的域名/example.json
如果响应头里包含 Content-Encoding: gzip,并且能看到 Vary: Accept-Encoding,说明 gzip 已经生效。
只看 HTML 页面同理:
curl -I -H "Accept-Encoding: gzip" https://你的域名/
对于图片资源,请求一张 JPG 图片,响应头里不应该出现 Content-Encoding: gzip,只保持原始图片类型即可。
另外还可以用浏览器开发者工具验证:打开“网络”面板,刷新页面,点击一个文本资源,查看“响应头”里的 Content-Encoding 是否为 gzip。
容易踩的坑和延伸建议
gzip 配置最常踩的坑有三个:
一是把 gzip_types 写成了大文件类型列表,比如误把 application/octet-stream 加进去,导致所有下载类文件都被压缩,既浪费 CPU 又可能破坏文件传输。
建议只保留文本类资源。
二是 gzip_comp_level 设置过高。
级别 9 在实际场景中并不能比级别 5 多压缩多少,但 CPU 占用会明显上升。
建议保持 5,除非你对压缩率有特殊要求。
三是改了配置后忘记 nginx -t 就直接重载。
语法错误会导致 Nginx 无法启动,影响线上服务。
一定要先测试再 reload。
如果你对性能调优有更高要求,还可以研究 gzip_static 模块——提前生成 .gz 文件让 Nginx 直接返回,但那是另一个话题了。
结论: Nginx gzip 压缩机智地聚焦文本、JSON、HTML,跳过图片,能获得明显的访问提速体验。
配置核心只有 gzip on、gzip_types 和验证命令,按本文步骤执行后就能看到可测量的压缩响应头。