可以在虚拟主机层级单独配置mod_deflate,实现不同站点使用不同压缩级别和策略;需将配置写入对应块内,确保模块已启用、用addoutputfilterbytype按需启用、deflatecompressionlevel可差异化设置,并配合setenvifnocase排除不压缩资源及header append vary accept-encoding保障缓存正确性。
可以在虚拟主机层级单独配置 mod_deflate,实现不同站点使用不同压缩级别和策略,无需全局统一。关键在于把压缩配置写进对应站点的 <virtualhost></virtualhost> 块内,并确保模块已启用、环境变量控制得当。
确认基础模块已加载且支持虚拟主机级配置
Apache 的 mod_deflate 默认支持在 <virtualhost></virtualhost> 中配置,但前提是:
-
LoadModule deflate_module modules/mod_deflate.so已在主配置中启用(检查httpd.conf或apache2.conf); -
mod_headers也建议启用,用于正确设置Vary: Accept-Encoding头,避免 CDN 或代理缓存混淆; - 不要在主配置中用
SetOutputFilter DEFLATE全局开启——这会覆盖虚拟主机内的精细控制,改用AddOutputFilterByType按需启用更安全。
为每个虚拟主机独立设定压缩级别与类型
在各站点的 <virtualhost></virtualhost> 配置段内(如 /etc/apache2/sites-available/example.com.conf),添加如下结构:
<ifmodule mod_deflate.c> # 启用该站点专属压缩 AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/xml <h1>单独设置压缩级别:高流量新闻站用 4,后台管理站用 9</h1> <p>DeflateCompressionLevel 4</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3961" title="Apache Superset Dashboard and SQL Exploration Skill"><img src="https://img.php.cn/upload/skill/000/000/081/178987691575372.jpg" alt="Apache Superset Dashboard and SQL Exploration Skill" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill3961" title="Apache Superset Dashboard and SQL Exploration Skill" class="overflowclass">Apache Superset Dashboard and SQL Exploration Skill</a> <p class="overflowclass">Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。</p> </div> <a rel="nofollow" href="/xiazai/skill3961" title="Apache Superset Dashboard and SQL Exploration Skill" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <h1>排除不压缩的资源(按后缀或路径)</h1> <p>SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|pdf|woff2|mp4)$ no-gzip dont-vary SetEnvIfNoCase Request_URI ^/api/.* no-gzip</p> <h1>强制为该站点添加 Vary 头(必需!否则 CDN 可能缓存错版本)</h1> <p><ifmodule mod_headers.c> Header append Vary Accept-Encoding </ifmodule></p></ifmodule>
注意:DeflateCompressionLevel 在虚拟主机内生效,不同站点可设不同值(如 3、6、9),数值越大 CPU 开销越高,但文本类资源(HTML/JS/CSS)通常 6 级已足够,无需盲目调至 9。
处理 PHP 输出等动态内容的压缩适配
PHP 脚本返回的内容是否被压缩,取决于它实际输出的 Content-Type 是否在 AddOutputFilterByType 列表中。例如:
- 若某站点的 API 返回
application/json,则配置中必须包含该类型; - 若后台系统大量输出
text/plain日志,也需显式加入白名单; - 避免用
SetOutputFilter DEFLATE全局启用——它可能误压二进制响应(如 PHP 直出图片),导致乱码或 500 错误。
验证与调试要点
配置完成后重启 Apache,逐个站点验证:
- 用
curl -I -H "Accept-Encoding: gzip" https://site-a.com/test.html查看响应头是否有Content-Encoding: gzip; - 对比不同站点的响应头和压缩后大小(浏览器开发者工具 → Network → Size 列);
- 检查错误日志:
tail -f /var/log/apache2/error.log,确认无deflate相关警告(如 MIME 类型未匹配、no-gzip 冲突等); - Windows 下 phpEnv 等环境需额外运行
httpd -M | findstr deflate确认模块真实加载,否则虚拟主机内配置无效。










