apache需通过mod_proxy+mod_cache_disk协同缓存动态接口,关键在于构建「代理→拦截→落盘」链路;模块加载顺序必须为mod_proxy、mod_proxy_http、mod_cache、mod_cache_disk,且cacheenable路径须匹配原始url而非后端路径,响应头cache-control: public与无set-cookie为硬性要求。

Apache 本身不直接缓存动态接口响应,必须通过 mod_proxy + mod_cache_disk 协同工作,把后端(如 Spring Boot)当成上游服务来代理并缓存其响应。关键不在“静态化”动作本身,而在构建一条可控、可落地的「代理→响应拦截→落盘缓存」链路。
必须加载且顺序正确的模块
缺一不可,顺序错误会导致缓存完全不生效:
-
mod_proxy 和 mod_proxy_http:负责转发请求到后端(例如
http://localhost:8080/api) -
mod_cache:缓存框架,必须在
mod_cache_disk之前加载 - mod_cache_disk:提供磁盘存储能力,真正写入缓存文件
-
mod_headers(推荐):用于补全或覆盖后端缺失/不合规的缓存头,比
mod_expires更灵活
缓存路径配置要匹配代理逻辑
CacheEnable disk /path 匹配的是 Apache 收到的原始 URL 路径,不是后端真实路径。常见错误是写错层级:
- 若配置了
ProxyPass /api/ http://localhost:8080/v1/,缓存指令应为CacheEnable disk /api/,不是/v1/ - 想统一缓存所有代理请求,可用
CacheEnable disk /,但需确保它不与静态资源规则冲突 - 建议起步时先限定子路径,例如
CacheEnable disk /public-api/,验证命中率(看响应头X-Cache: HIT)后再扩展
后端响应头是缓存生效的硬门槛
mod_cache_disk 极其严格:默认只缓存同时满足以下条件的响应:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 状态码为 200、301 或 404
- 含
Cache-Control: public, max-age=N(private、no-store、no-cache均被拒绝) - 不含
Set-Cookie头
Spring Boot 示例写法:
ResponseEntity.ok()
.header("Cache-Control", "public, max-age=3600")
.body(data);
含用户身份、Token 或 Session 的接口,绝不能加 public,否则有严重安全风险。
绕过限制的常用配置(慎用)
当无法修改后端代码时,可在 Apache 配置中放宽条件,但会牺牲缓存安全性:
-
CacheIgnoreHeaders Set-Cookie Cache-Control:忽略这两个响应头,强制尝试缓存 -
CacheIgnoreNoLastMod on:不依赖Last-Modified判断新鲜度 -
CacheIgnoreCacheControl off(默认):仍尊重后端Cache-Control;设为on可完全忽略它 - 缓存目录权限必须正确:
CacheRoot "/var/cache/apache2/mod_cache_disk"需由 Apache 进程用户(如www-data)可写,否则静默失败










