Apache 动态资源压缩需兼顾时机、强度、兼容性与负载控制:推荐压缩 text/html、application/json 等文本类型,避免压缩已编码二进制或预压缩内容,DeflateCompressionLevel 推荐设为 6,高负载可降至 4–5,须规避 IE6–8 并防止重复压缩。

Apache 对动态资源(如 PHP 生成的 HTML、JSON 接口响应、AJAX 返回内容)做压缩时,不能只依赖静态文件那一套配置。动态内容压缩更讲究“时机、强度、兼容性与负载控制”,否则容易引发 CPU 过热、响应延迟甚至旧浏览器解压失败。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
明确哪些动态资源适合压缩
不是所有动态输出都值得压缩:
- ✅ 推荐压缩:text/html(模板渲染页)、application/json(API 响应)、text/xml、application/javascript(内联或动态 JS)、text/css(动态生成样式)
- ❌ 避免压缩:已编码的二进制内容(如 base64 图片嵌入体)、加密/签名后的 payload(可能破坏校验)、gzip 已封装的流式响应(如 chunked + pre-compressed)
- ⚠️ 谨慎压缩:含敏感令牌的响应(如含 JWT 的 JSON),高并发下建议降级压缩等级,防 CPU 突增
用 DeflateCompressionLevel 控制 CPU 与体积的平衡
动态内容通常由 PHP、Python 或 Node.js 后端实时生成,压缩发生在 Apache 输出阶段:
- 等级 6 是默认推荐值:对 HTML/JSON 平均压缩率 65%~75%,CPU 开销可控
- 高负载时段可设为 4~5:压缩率略降(约 55%~60%),但 CPU 占用下降 30%+,适合突发流量或老旧服务器
- 切勿设为 9:对动态内容几乎无额外收益,反而易触发 Apache worker 阻塞,尤其在 prefork MPM 下
按请求特征差异化启用压缩
单纯靠 AddOutputFilterByType 不够,需结合条件判断:
- 对首屏关键 HTML,强制启用并保持等级 6
- 对带
X-Requested-With: XMLHttpRequest的 AJAX 请求,可加SetEnvIf动态降级:SetEnvIfNoCase Request_Header "X-Requested-With" "XMLHttpRequest" deflate_level=4 <IfModule mod_deflate.c> DeflateCompressionLevel 6 SetEnvIf env=deflate_level ^4$ DeflateCompressionLevel 4 </IfModule>
- 对含
Cache-Control: no-cache或Vary: Cookie的响应,仍可压缩,但需确保Vary头正确传递(配合mod_headers)
规避旧客户端与中间件陷阱
动态响应常被 CDN、反向代理或老旧浏览器消费:
- 显式排除 IE6–8:用
BrowserMatch指令防止其错误解压崩溃 - 若后端已启用 gzip(如 PHP 的
zlib.output_compression),必须关闭 Apache 的重复压缩,否则会报错或返回乱码 - 使用
Header append Vary Accept-Encoding确保 CDN/代理能正确缓存不同编码版本
不复杂但容易忽略

















