Gzip免费省70%带宽但Brotli还能再挤20%,一台服务器上50个站怎么统一开压缩不遗漏
一个网站没开压缩是什么概念?首页HTML 80KB,CSS文件120KB,JS文件300KB,光这三个文件就500KB。用户打开你网站的时候,这500KB要原封不动地从服务器传过去。开了Gzip之后,500KB变150KB,省了70%。如果换成Brotli,150KB再挤掉20%,剩120KB。三秒变一秒的事。
问题在于,手上只有一个网站的时候,开个压缩就是改一行配置文件的事。当你管理的是20个、50个甚至更多的站点时,情况就变了——有的站是宝塔面板建的,有的是手动Nginx配置的,有的跑了CDN,有的挂在IIS上。怎么确保每一个站都开了压缩、而且开的不是假把式?
四个关键事实,先看完再动手
| 1 | Gzip能把HTML/CSS/JS/JSON压缩到原来的20%-30%,一个站一天省几GB流量是常事 |
| 2 | Brotli比Gzip压缩率再高14%-21%,但需要HTTPS,且CPU消耗更大 |
| 3 | 多站点批量开启压缩的核心不是"会不会配置",而是"能不能确保每个站都没遗漏" |
| 4 | 检测比配置更重要——没开压缩的站点可能默默跑了半年你都不知道 |
一、压缩到底能省多少?把数字摆出来看看
先看一组Gzip的实测数据。以一个典型的WordPress站点首页为例,HTML文档89KB,压缩后15.6KB,压缩率82.5%,体积直接缩到原来的六分之一。CSS文件128KB,压缩后22.3KB。JS脚本256KB,压缩后68.4KB。光这三个文件,不开压缩要传473KB,开了Gzip只要106KB,省了78%的传输量。
换成Brotli差距更大。根据Certsimple的研究数据,同样的文件类型下:JavaScript文件Brotli比Gzip再小14%,HTML再小21%,CSS再小17%。Google自己的报告显示,对常见Web资源,Brotli的整体性能比Gzip提升17%-25%。最极端的是Brotli压缩级别1的压缩率,甚至超过了Gzip的最高级别9。
HTML 文档
82.5%
Gzip 压缩率(89KB→15.6KB)

CSS 样式表
82.6%
Gzip 压缩率(128KB→22.3KB)
JS 脚本
73.3%
Gzip 压缩率(256KB→68.4KB)
Brotli 额外增益
+17-25%
在 Gzip 基础上再省
换算成实际场景:一个日均5000UV的网站,假设每个页面需要传输500KB未压缩资源。一个月光HTML/CSS/JS的传输量就是500KB × 5000 × 30 ≈ 75GB。开了Gzip后降到约15GB,月省60GB带宽。如果是50个这样的站点呢?省3TB。
二、先确认哪些站没开压缩,别一上来就改配置
批量操作最忌讳的就是"我觉得都开了"。很多站看起来加载不慢,可能是因为页面本身简单、图片已经做了CDN,但压缩实际上没开——HTML和CSS还是在裸传。一个站一个月多跑几十GB流量,服务器账单不会告诉你原因。
三种方法可以批量检测哪些站开了压缩、哪些没有:
方法一:curl 命令行(最快)
一条命令检测一个站:
curl -I -H "Accept-Encoding: gzip" https://域名.com | findstr Content-Encoding
返回 Content-Encoding: gzip 或 br 说明已开启。没返回就是没开。可以写个批处理循环跑几十个域名一次性扫完。
方法二:Chrome DevTools
F12 → Network → 刷新页面 → 点任意资源 → Response Headers
看 Content-Encoding 字段。适合逐个排查,不适合批量检测。
方法三:在线检测工具
GiftOfSpeed Gzip Test、WhatIsMyIp compression check 等
粘贴URL一键检测,还能看压缩前后的体积对比。但逐个输入50个域名太慢。

如果你管理的是几十个站,强烈建议用curl写个检测脚本。把域名列表放进一个txt文件,一行一个域名,然后跑一个循环:
@echo offfor /f "tokens=*" %%a in (domains.txt) do (echo 检测: %%acurl -s -I -H "Accept-Encoding: gzip" https://%%a | findstr /i "Content-Encoding"echo.)pause跑完就能一目了然:哪些站返回了Content-Encoding,哪些什么都没返回。后者就是你需要处理的目标。
三、四种环境下的开启方式,选对你的场景
| 服务器环境 | 开启方式 | 操作难度 | 批量可行性 |
|---|---|---|---|
| Nginx | nginx.conf 添加 gzip 配置块 | 中等 | 高(include 公共配置) |
| 宝塔面板 | 网站设置 → 勾选 Gzip | 低 | 中(需逐个站勾选或改公共模板) |
| Apache | .htaccess 或 httpd.conf 启用 mod_deflate | 中等 | 中(可批量复制 .htaccess) |
| IIS | IIS 管理器 → 压缩模块 → 启用静态/动态压缩 | 低 | 高(服务器级别统一开启) |
四、Nginx 环境:一个公共配置解决所有站点
Nginx是站群管理中最常见的Web服务器。它的优势在于可以用include指令引入公共配置文件,所有站点共享同一套压缩配置,改一处全部生效。在nginx.conf的http块中添加以下配置:
# ========== Gzip 压缩配置(放入 http 块) ==========gzip on;gzip_vary on;gzip_proxied any;gzip_comp_level 6;gzip_min_length 256;gzip_typestext/plaintext/csstext/xmltext/javascriptapplication/javascriptapplication/x-javascriptapplication/jsonapplication/xmlapplication/rss+xmlapplication/atom+xmlimage/svg+xmlfont/ttffont/otffont/wofffont/woff2;gzip_disable "msie6";几个关键参数要理解清楚:
gzip_comp_level 6
压缩级别1-9,6是性价比最佳点。级别越高CPU消耗越大,6级能兼顾压缩率和服务器负载。别无脑设9,CPU开销多30%,压缩率只多2%-3%。
gzip_min_length 256
小于256字节的文件不压缩。太小的文件压缩后体积反而可能变大(压缩头开销),设这个值避免做无用功。
gzip_vary on
在响应头中添加 Vary: Accept-Encoding,告诉CDN和代理"这个资源有压缩和未压缩两个版本"。不开这个CDN缓存可能出问题。
gzip_types 别漏类型
最常见的坑:gzip_types里漏了application/json或image/svg+xml,API返回的JSON和SVG图标没被压缩。
想要更激进的压缩效果,可以在Gzip的基础上叠加Brotli。Brotli需要Nginx编译时加入ngx_brotli模块,宝塔面板默认不带,需要手动编译安装。两者可以同时开启,浏览器优先选Brotli,不支持的自动退回Gzip,兼容性没问题。代价是Brotli压缩时CPU消耗更高——静态资源可以预压缩,动态内容如果服务器性能吃紧,可以只对静态文件开Brotli,动态内容只用Gzip。
五、宝塔面板:最常用但批量管理最烦
宝塔面板单个站开启Gzip非常简单:进入网站设置 → 找到"Gzip"选项 → 勾选启用 → 保存。三步搞定。但宝塔默认给每个站生成独立的Nginx配置文件,没有一个"一键应用到所有站点"的开关。有20个站就要重复20次,而且新建站点时容易忘记勾选。
方案一:改 Nginx 主配置(推荐)
在 /www/server/nginx/conf/nginx.conf 的 http 块里加上 Gzip 配置(第四节的代码),nginx -s reload 重启。
一次配置,所有站点生效,新建站点自动继承。不需要逐个站改,最省事。
方案二:宝塔 API 批量操作
宝塔面板提供API接口,可以写脚本批量获取站点列表,逐个调用修改配置的接口。

适合站点数量超过50个、且经常需要批量操作其他配置(SSL、伪静态等)的场景。
方案三:手动逐站+检测脚本兜底
站点少于15个,花10分钟逐站勾选,然后用curl检测脚本跑一遍确认没遗漏。
最简单直接,但每次新增站点都要记住勾选,容易忘。
六、CDN 开了压缩还要在源站开吗?很多人搞反了
这是一个高频疑问。答案是:看CDN怎么配置的,不同情况处理方式完全不同。
| 场景 | CDN 压缩 | 源站压缩 | 说明 |
|---|---|---|---|
| CDN 开启智能压缩 | ✅ 开启 | ❌ 关闭 | CDN回源时如果源站已压缩过,CDN可能跳过二次压缩。源站关掉,让CDN全权处理。 |
| CDN 不处理压缩 | ❌ 未开启 | ✅ 开启 | CDN只是转发,压缩全靠源站。不开用户收到的就是裸文件。 |
| 只对图片/视频用CDN | 仅加速静态文件 | ✅ 开启 | HTML页面从源站直接返回,CDN不管文本压缩,源站必须自己开。 |
| 多层CDN架构 | 外层开启 | 内层/源站关闭 | 最外层CDN负责压缩和缓存,避免多层压缩冲突。 |
一个常见的坑:源站开了Gzip,CDN也开了Brotli。用户请求过来,CDN回源拿到的是Gzip压缩过的内容,然后CDN解压、再用Brotli压缩一遍。多了一次解压+再压缩的CPU开销,CDN节点性能被白白浪费。正确做法是CDN开启压缩、源站关闭压缩,CDN回源拿原始内容,自己压缩后返回给用户。
七、怎么确认"真的开了"而不是"以为开了"?
配置写完、Nginx reload之后,很多人就觉得搞定了。但以下几种情况压缩实际没生效:
配置文件没被加载
改了nginx.conf但没执行 nginx -s reload,或者配置写在了不会被include的位置。先nginx -t测试语法,再reload,最后curl验证。
站点级配置覆盖了全局配置
宝塔的站点配置中可能有 gzip off; 覆盖了http块里的 gzip on;。检查站点配置文件中是否有冲突指令。
CDN缓存了旧版本
配置改完后CDN边缘节点还缓存着没压缩的旧版本。需要刷新CDN缓存,或者直接curl源站IP绕过CDN验证。
文件类型不在gzip_types里
gzip on了但某个特定文件类型没有被压缩,大概率是gzip_types漏掉了。检查该文件的Content-Type是否在配置列表里。
八、Gzip 还是 Brotli?根据服务器配置选
| 对比维度 | Gzip | Brotli |
|---|---|---|
| 压缩率 | 60%-80% | 比 Gzip 再高 14%-21% |
| CPU 消耗 | 低 | 高(压缩级别越高差距越大) |
| 兼容性 | 所有浏览器,HTTP/HTTPS均可 | 现代浏览器支持,需 HTTPS |
| 部署难度 | Nginx/Apache 内置,开箱即用 | 需额外编译模块,宝塔默认不带 |
| 适用场景 | 所有网站,尤其是动态内容多的站 | 静态资源为主的站,或通过CDN处理 |
对大多数多站点管理者来说,最务实的策略是:源站统一开Gzip作为兜底,CDN层开Brotli来获取更高压缩率。这样即使某个站没走CDN或者CDN回源失败,源站的Gzip还能保证基本压缩。如果你用的是腾讯云CDN、阿里云CDN等支持Brotli的CDN,在CDN控制台勾选Brotli智能压缩就行,源站不需要额外操作。
如果你不用CDN,那就看服务器性能:CPU空闲率高、站点流量不大的话,可以Nginx编译Brotli模块后双开;如果服务器本身负载就高,老实开Gzip就够用了。对于大多数中小站点来说,Gzip level 6的配置已经能覆盖90%以上的压缩需求,多出来的那点Brotli增益在百KB级别页面上差异不大。
批量管理几十个站点的时候,压缩配置的一致性比追求极致压缩率重要得多。与其花半天给每个站调Brotli参数,不如10分钟在Nginx主配置文件里写好Gzip,curl扫一遍确认全部生效,然后该干嘛干嘛。带宽成本省下来了,服务器账单也不会莫名其妙飙高。
对于用UC建站系统管理多站点的用户来说,系统底层统一基于Nginx+WordPress架构,只需要在服务器层面的nginx.conf做一次Gzip配置,所有通过系统部署的站点自动继承压缩设置。配合系统自带的多站看板,可以批量检测每个站点的Content-Encoding状态,快速定位哪些站点压缩没生效、哪些站点的CSS或JS文件类型被遗漏了——这种统一管控的思路,比手动逐个登录服务器改配置高效得多。
说到底,网站压缩这件事不复杂,复杂的是"有50个站要管"。一个人的精力就那么多,手改配置总有遗漏的时候。把能统一的东西统一掉,把能自动检测的东西脚本化,才是多站点运维的正解。
