Apache mod_cache实现的是服务端响应缓存而非静态化存储,需协同mod_proxy、mod_cache_disk、mod_headers等模块,CacheEnable路径须匹配ProxyPass前缀,Java端必须返回public+max-age头,CacheRoot目录需可写,命中通过X-Cache响应头验证。

Apache mod_cache 本身不支持“静态化存储”这种说法——它不会把 API 响应转成 HTML 文件落地到网站根目录,而是将完整的 HTTP 响应(含状态码、头、响应体)以二进制形式缓存在磁盘或内存中,后续相同请求直接复用该响应。所谓“静态化”,实为**服务端响应缓存**,目标是绕过后端 Java/Node.js 等处理链,实现毫秒级返回。
必须启用的模块组合
单独加载 mod_cache 或 mod_cache_disk 不起作用。Restful API 缓存依赖代理转发路径,因此必须协同工作:
-
mod_proxy和mod_proxy_http:负责把/api/类请求转发给后端(如http://localhost:8080/v1/) -
mod_cache和mod_cache_disk:接管代理返回的响应,按规则落盘 -
mod_headers(推荐):用于调试或强制补全缓存头,比如后端未返回Cache-Control时可临时注入
关键配置要点
路径匹配、响应头、权限三者缺一不可:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
CacheEnable 路径必须与 ProxyPass 前缀一致:例如
ProxyPass /api/ http://localhost:8080/v1/,则写CacheEnable disk /api/,不是/v1/,也不是/ -
Java 后端必须返回显式可缓存头:
Cache-Control: public, max-age=60(不能只写max-age=60,缺public就被拒绝) -
忽略干扰头:加
CacheIgnoreHeaders Set-Cookie,否则带Set-Cookie的响应一律不缓存 -
CacheRoot 目录需可写:如
CacheRoot /var/cache/apache2/mod_cache_disk,执行chown www-data:www-data /var/cache/apache2/mod_cache_disk
验证是否真正命中
不要只看响应快慢——Apache 默认静默失败。务必检查响应头:
- 命中成功:响应中出现
X-Cache: HIT from example.com - 未命中但尝试缓存:出现
X-Cache: MISS from example.com - 完全跳过缓存:无
X-Cache头,且日志中无cache: Caching url记录 - 常见失败原因:后端返回
private、no-store;状态码非 200;目录权限错误;模块未加载全
推荐渐进式配置步骤
从窄到宽,避免一上来就配 CacheEnable disk /api/ 导致大量 MISS:
- 先测试静态路径:
CacheEnable disk /static/,确认磁盘结构和命中率 - 再锁定一个低频、无鉴权、无 Cookie 的 API 接口,如
/api/ping或/api/status - 后端 Spring Boot 示例写法:
ResponseEntity.ok()
.header("Cache-Control", "public, max-age=30")
.body(Map.of("status", "ok")); - 上线前用
curl -I多次请求,观察X-Cache变化

















