网站Gzip压缩从HTML页面189KB两行Nginx配置压到23KB白捡87%的压缩率PageSpeed从52分跳到89分而Brotli虽然还能再少14%但多花30%CPU对日均PV低于十万的站性价比不如把钱投给CDN
网站Gzip压缩这件事,说它是性能优化里投入产出比最高的手段,一点不过分。不需要买任何付费工具、不需要改代码、不需要换服务器,就是在配置文件里加几行字,重启一下服务,页面传输体积直接砍半甚至更多。但问题是很多人压根不知道自己的站有没有开压缩,或者开了但配置参数不对导致效果大打折扣。这篇文章从检测到配置到验证,把整个流程拆清楚。
三个数字先记住
1. 未开启Gzip的网站比开启的多传输60%-80%的数据,这部分全是浪费的带宽和加载时间。
2. Google研究:页面加载每慢1秒,移动端跳出率上升7%。压缩可以直接帮你在传输环节省下0.5-2秒。
3. Gzip压缩级别5-6是甜点区间——压缩率接近最高但CPU消耗只有最高级别的三分之一。
一、你的网站到底有没有开Gzip?四个免费检测工具对比
在动手配置之前,第一步永远是"检测"。别凭感觉,用工具跑一遍就知道。
如果你不想用网页工具,浏览器开发者工具也能看:打开Chrome DevTools → Network标签 → 刷新页面 → 点任意一个请求 → 看Response Headers里有没有Content-Encoding: gzip或Content-Encoding: br。没有这一行,就是没开压缩。
命令行检测更直接:
返回结果里看到Content-Encoding: gzip就说明开了。

二、Nginx开启Gzip:两行核心配置就能用,但要调好这六个参数
Nginx是现在使用率最高的Web服务器,也是Gzip配置最直观的。
最简配置(能跑就行)
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
就这两行,放在nginx.conf的http块里,reload一下,HTML页面能压掉60%-80%。但光这两行远远不够——默认只压text/html,其他类型全靠gzip_types指定;压缩级别默认是1(最低),基本等于没压。
生产环境推荐配置(六个参数都调到位)
gzip on;
gzip_comp_level 5; # 压缩级别1-9,5是甜点
gzip_min_length 1024; # 小于1KB的文件不压,压了反而更大
gzip_buffers 16 8k; # 缓冲区大小
gzip_http_version 1.1; # HTTP版本限制
gzip_vary on; # 添加Vary: Accept-Encoding头,CDN缓存友好
gzip_proxied any; # 代理请求也压缩
gzip_disable "msie6"; # IE6不支持gzip(2026年基本用不到了但留着不碍事)
# 压缩类型——只压文本类资源,图片视频不要压
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml
application/xml+rss
image/svg+xml
application/x-font-ttf
application/x-font-opentype
application/vnd.ms-fontobject
font/ttf
font/otf;
六个关键参数逐个说:
gzip_comp_level(1-9):这个参数直接决定压缩率和CPU消耗的平衡。级别1压得最少但最快,级别9压得最狠但CPU翻倍。实测数据显示,级别5相比级别1压缩率提升约35%,CPU消耗仅增加约20%;而级别9相比级别5压缩率只再提升8%,CPU消耗却翻倍。所以5-6是黄金区间。
gzip_min_length:很多人忽略这个参数,导致小文件压完之后反而变大。Gzip压缩会在文件头加一段元数据,如果原文件本身就很小(几百字节),加了元数据之后压缩后的文件可能比原文件还大。设1KB(1024字节)以上才压缩是业界共识。
gzip_types:Nginx默认只压缩text/html类型的响应。如果你不改这个参数,CSS、JS、JSON、XML、SVG等文本类资源完全不会被压缩。这也是为什么很多人的站"开了Gzip但PageSpeed还是不及格"——只压了HTML,其他大头没压。
gzip_vary:加不加这行对压缩效果没影响,但对CDN缓存有影响。它告诉缓存服务器"这个响应是否压缩取决于客户端支不支持,所以请按Accept-Encoding头分别缓存"。不加的话可能出现"CDN缓存了压缩版,但给不支持压缩的老浏览器也返回压缩版"的尴尬。
gzip_proxied:如果你的Nginx前面还有一层代理(比如CDN回源、负载均衡),这个参数决定了经过代理的请求要不要压缩。设any是最省事的,但如果你确定前面的CDN已经处理了压缩,可以设off避免双重压缩。
gzip_buffers:一般不用改,默认值够用。但如果你的页面特别大(几百KB的HTML),可以调大缓冲区。
⚠ 三个绝对不要压的东西
· 图片(jpg/png/gif/webp):这些格式本身就是压缩过的,再Gzip一遍不仅不会变小,反而可能变大,还白白浪费CPU。

· 视频和音频文件:同上,已经是最优压缩了。
· 已压缩的归档文件(zip/pdf/docx):压了等于白压,压缩率接近0。
三、Apache开启Gzip:两步走,mod_deflate是关键词
Apache的Gzip压缩通过mod_deflate模块实现。和Nginx不同,Apache需要先确认模块已加载,再配置压缩规则。
第一步:确认模块已启用
在httpd.conf中找到以下两行,确保前面没有#注释符:
LoadModule headers_module modules/mod_headers.so
第二步:添加压缩规则(httpd.conf或.htaccess)
# 压缩HTML、CSS、JS、XML、JSON等文本资源
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml
AddOutputFilterByType DEFLATE text/javascript application/javascript
AddOutputFilterByType DEFLATE application/json application/xml
AddOutputFilterByType DEFLATE image/svg+xml
# 排除已压缩格式
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|rar|pdf)$ no-gzip dont-vary
</IfModule>
如果用XAMPP等集成环境,还需要额外注意一个坑:php.ini里有一个zlib.output_compression参数,如果它和Apache的mod_deflate同时开启,会冲突导致页面乱码。建议只在Apache层面开压缩,php.ini里把zlib.output_compression设为Off。
四、IIS开启Gzip:全图形化操作,但默认配置需要改
Windows Server上的IIS开启Gzip不需要写配置文件,全程点鼠标。但IIS默认只压缩静态文件且压缩类型列表不全,需要手动补。
三步开启
Step 1:安装Windows功能。服务器管理器 → 添加角色和功能 → Web服务器(IIS) → 性能 → 勾选"静态内容压缩"和"动态内容压缩"。
Step 2:IIS管理器启用压缩。打开IIS管理器 → 点击服务器节点 → 找到"压缩"图标 → 勾选"启用静态内容压缩"和"启用动态内容压缩"。
Step 3:补全压缩类型。在压缩页面的"压缩类型"里,默认只有text/html等少数几种,需要手动添加application/json、application/javascript、image/svg+xml等。
IIS的Gzip有一个独特的优势:静态压缩会把压缩结果缓存到磁盘,同一个文件第二次请求时直接用缓存好的压缩版本,不再消耗CPU。但这也意味着IIS需要配置压缩缓存目录的磁盘空间和清理策略,长期不清理会堆积大量压缩缓存文件。

五、Gzip vs Brotli:到底要不要上Brotli?
Brotli是Google在2015年发布的压缩算法,相比Gzip压缩率更高。但2026年了,Brotli有没有必要上?
最优解:CDN层开Brotli,源站只开Gzip
这是目前最聪明也最省事的方案。源站Nginx开Gzip(省CPU),CDN(Cloudflare/腾讯云CDN/阿里云CDN)开启Brotli智能压缩。CDN节点CPU充足,Brotli的高压缩率带来的带宽节省远大于CPU成本。浏览器请求过来时CDN用Brotli返回,回源时用Gzip,两端都得到了最优解。而且你不需要自己装ngx_brotli模块,CDN控制台点一下就行。
六、CDN层面的压缩:Cloudflare一键开启,零配置
如果你用了CDN(Cloudflare、腾讯云CDN、阿里云CDN等),压缩这件事可以完全交给CDN层处理,源站甚至不需要配置Gzip。
CDN压缩有一个重要的注意点:如果源站和CDN同时开压缩,需要确保CDN回源时不重复压缩。做法是在CDN配置里设置回源请求头不携带Accept-Encoding,或者在源站配置gzip_proxied off让源站对CDN的回源请求不压缩。否则可能出现"源站压缩一次、CDN再压缩一次"的双重压缩问题,虽然不一定会出错,但浪费了双方CPU。
七、四种场景的压缩方案选择
八、配置完之后怎么验证压缩效果?
压缩不是"开了就行",要验证两件事:压缩确实生效了,压缩率在合理范围内。
验证清单
1. 用检测工具跑一次:GiftOfSpeed或WebsitePlanet输入你的域名,看是否显示"Gzip is enabled"和压缩率。HTML页面压缩率应该在60%以上才算正常,如果只有30%-40%,说明gzip_types没配全或压缩级别太低。
2. 用浏览器DevTools验证:打开Network面板,看CSS/JS/HTML请求的Response Headers有没有Content-Encoding: gzip,同时对比Size列的两个数值(传输大小/实际大小),传输大小应该明显小于实际大小。
3. 用PageSpeed Insights跑分:配置压缩前后各跑一次,重点关注"启用文本压缩"这一项的通过状态。如果之前这项是红色,配完变绿色,说明配置成功。同时看LCP的数值变化——压缩通常能让LCP降低0.5-1.5秒。
4. 检查服务器CPU:配置完压缩后观察24小时,确认CPU使用率没有异常升高。如果CPU从20%跳到60%以上,说明压缩级别设太高了,调回4-5。
5. 抽检图片和视频请求:确认这些资源的Response Headers里没有Content-Encoding: gzip。如果出现了,说明压缩规则写太宽了,赶紧把图片视频格式从压缩类型里排除掉。
网站Gzip压缩是典型的"一次配置、永久受益"的优化。不需要续费、不需要维护、不需要改业务代码,就是服务器配置加几行字的事。但效果是实实在在的——页面传输体积砍半、加载时间明显缩短、PageSpeed评分提升、带宽成本下降、SEO排名受益。
这件事最容易被忽视的不是技术门槛(几乎没有),而是"以为自己开了但实际上没开"。很多人的Nginx里确实写了gzip on,但gzip_types只留了默认值,等于只压了HTML。CSS和JS这两类体积最大的文本资源完全没压到,相当于开了个寂寞。配置完之后一定要用检测工具验证一遍,看CSS和JS请求的响应头里有没有Content-Encoding: gzip——有这个才叫真开了。
