你的网站加载慢,真不一定是网速或服务器的问题——可能只是少按了一个“压缩键”。
试试看:打开开发者工具的网络面板,随便点一个 .css 或 .js 文件,如果 Content-Encoding 里没写 gzip,那恭喜你,手边就有一份立竿见影的提速方案。
Gzip压缩到底能帮你省下多少流量?
Gzip 是一种老牌但极其靠谱的压缩算法。它不改内容,只把文本类文件“挤一挤”再发出去——HTML、CSS、JS 这些纯文本,动不动就能压掉 60%~80% 的体积。
浏览器收到后自动解压,用户完全无感。但服务器少传了数据,带宽压力小了,用户等得少了,首屏时间自然快了。
我帮一个做行业白皮书的企业站调优时,首页光是 JS 和 CSS 就塞了 700 多 KB。开了 Gzip 后,这部分资源直接缩到 200KB 出头。页面滚下来的速度明显变顺,用户往下拉的深度也上去了。
如何在Apache中开启Gzip压缩?
Apache 用的是 mod_deflate 模块,大多数环境默认就带着,不用装,只用配。
配置可以写在三处:主配置 httpd.conf、虚拟主机 .conf 文件,或者最常用的——网站根目录下的 .htaccess。选 .htaccess 最省事:改完保存,不用重启 Apache,立刻生效。
关键就两行指令:告诉 Apache “要压缩”,再告诉它“哪些文件值得压”。
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
</IfModule>
这段代码覆盖了网页最常传输的文本资源。复制粘贴进 .htaccess,保存,就完成了第一步。
配置Gzip时有哪些必须避开的坑?
别给已经压缩过的文件“二次加压”。JPEG、PNG、MP4、PDF 这些格式本身就有压缩逻辑,再套一层 Gzip,基本压不出新东西,反而白耗 CPU。
所以得明确告诉 Apache:“这些类型,跳过。”
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
# 图片、视频、压缩包、PDF 全部绕开
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|gz|rar|bz2|pdf|mp[34]|avi|mov)$ no-gzip dont-vary
</IfModule>
老古董浏览器(比如 IE6)确实不认 Gzip,但今天几乎没人用了。Apache 默认已处理兼容逻辑,你不用额外操心。
压缩级别也别贪高。DeflateCompressionLevel 范围是 1~9,设成 9 确实更省流量,但 CPU 占用会明显升高。日常用 6,是压缩率和响应速度之间最实在的平衡点。
怎么验证Gzip压缩已经生效了?
别信配置,只信响应头。
打开你的网站 → 按 F12 → 切到「网络」→ 刷新 → 找一个 .css 或 .js 文件 → 点开它 → 左侧选「标头」→ 往下翻找 Content-Encoding。
如果值是 gzip,说明成了。再对比右上角的「大小」和「传输后大小」,差得越明显,说明压得越实在。
命令行党也可以用 curl 快速确认:
curl -I -H "Accept-Encoding: gzip" https://你的域名.com/style.css
只要返回头里有 Content-Encoding: gzip,就没问题。
开启Gzip后网站速度没变化?试试这3个排查方法
配置写了,但没效果?先别怀疑人生,按顺序检查这三点:
模块真加载了吗?
终端里跑一句apachectl -M | grep deflate(Linux/macOS)或httpd -M | findstr deflate(Windows)。没输出deflate_module,说明模块没启用,得去httpd.conf里找到#LoadModule deflate_module modules/mod_deflate.so,删掉开头的#,再重启 Apache。配置写错位置了吗?
.htaccess文件必须放在网站根目录,且所在目录的AllowOverride设置得允许FileInfo(常见于虚拟主机配置)。用apachectl -t检查语法有没有拼错,比如漏了<IfModule>闭合标签。有没有被别的配置盖过去了?
尤其是用了 CDN 的站点——很多 CDN 默认开启压缩,还会主动删掉Content-Encoding: gzip响应头。这时得去 CDN 后台关掉它的压缩功能,或者设置为“透传源站头”,让 Apache 的配置真正起效。
高级技巧:如何精细控制Gzip压缩规则?
基础配置够用,但如果你管着几十个子站,或者对性能抠得特别细,可以再加点控制。
比如,把核心 JS/CSS 压得更狠一点,普通 HTML 保持常规压缩:
<IfModule mod_deflate.c>
DeflateCompressionLevel 6
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
# 对 .css 和 .js 单独提级到 9
<FilesMatch "\.(css|js)$">
DeflateCompressionLevel 9
</FilesMatch>
</IfModule>
再进一步,可以配合 mod_filter 只压大于 1KB 的文件,避免为一堆几十字节的小图标反复开销 CPU;也可以用 mod_headers 给压缩后的资源加个长缓存头,比如 Cache-Control: public, max-age=31536000,让浏览器下次直接读本地缓存。
所有高级改动做完,务必回到开发者工具里重验一遍——压缩开了,但别让页面变卡。
今天就能执行的具体操作步骤:
- 打开你正在用的服务器(比如宝塔、cPanel、或者直接 SSH),进入网站根目录;
- 找到
.htaccess文件,用编辑器打开(没有就新建一个); - 把下面这段代码,原样粘贴进去(注意别破坏原有规则):
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|gz|rar|bz2|pdf|mp[34]|avi|mov)$ no-gzip dont-vary
</IfModule>
- 保存文件;
- 回到网站,按
F12→「网络」→ 刷新 → 点一个.css文件 → 查Content-Encoding是否为gzip; - 如果看到了,收工。没看到?回头看看第 1 步模块是否启用,或者第 2 步
.htaccess是否放对了位置。