你的网站加载慢,真不一定是网速或服务器的问题——可能只是少按了一个“压缩键”。

试试看:打开开发者工具的网络面板,随便点一个 .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个排查方法

配置写了,但没效果?先别怀疑人生,按顺序检查这三点:

  1. 模块真加载了吗?
    终端里跑一句 apachectl -M | grep deflate(Linux/macOS)或 httpd -M | findstr deflate(Windows)。没输出 deflate_module,说明模块没启用,得去 httpd.conf 里找到 #LoadModule deflate_module modules/mod_deflate.so,删掉开头的 #,再重启 Apache。

  2. 配置写错位置了吗?
    .htaccess 文件必须放在网站根目录,且所在目录的 AllowOverride 设置得允许 FileInfo(常见于虚拟主机配置)。用 apachectl -t 检查语法有没有拼错,比如漏了 <IfModule> 闭合标签。

  3. 有没有被别的配置盖过去了?
    尤其是用了 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,让浏览器下次直接读本地缓存。

所有高级改动做完,务必回到开发者工具里重验一遍——压缩开了,但别让页面变卡。


今天就能执行的具体操作步骤:

  1. 打开你正在用的服务器(比如宝塔、cPanel、或者直接 SSH),进入网站根目录;
  2. 找到 .htaccess 文件,用编辑器打开(没有就新建一个);
  3. 把下面这段代码,原样粘贴进去(注意别破坏原有规则):
<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>
  1. 保存文件;
  2. 回到网站,按 F12 →「网络」→ 刷新 → 点一个 .css 文件 → 查 Content-Encoding 是否为 gzip
  3. 如果看到了,收工。没看到?回头看看第 1 步模块是否启用,或者第 2 步 .htaccess 是否放对了位置。