apache mod_cache需与mod_proxy配合才能缓存后端响应,单独启用mod_cache_disk对spring boot等动态接口无效;必须按序加载mod_cache、mod_cache_disk、mod_proxy及mod_headers等模块,并正确配置cacheenable路径、响应头与缓存目录权限。

Apache 的 mod_cache 本身不直接缓存后端接口响应,必须搭配 mod_proxy 构成「代理+缓存」链路才能生效。单独启用 mod_cache_disk 对 Java/Spring Boot 等动态接口几乎无效,关键在于整个请求路径和响应头的协同控制。
必须加载的核心模块
缺一不可,且加载顺序很重要:mod_cache 必须在 mod_cache_disk 之前。
-
mod_proxy和mod_proxy_http:负责把请求转发给后端(如 localhost:8080) -
mod_cache和mod_cache_disk:负责接收代理返回的响应并落盘 -
mod_headers(推荐)或mod_expires:用于补全/覆盖后端缺失的缓存头
缓存路径配置要匹配代理逻辑
CacheEnable disk / 并不等于“缓存所有请求”。它的路径匹配对象是 Apache 接收到的原始 URL,不是后端真实路径。
- 若配置了
ProxyPass /api/ http://localhost:8080/v1/,则应写CacheEnable disk /api/,而非/v1/ - 若想缓存全部代理请求,可统一用
CacheEnable disk /,但需确保其他规则(如静态资源)不冲突 - 建议先从子路径入手,例如
CacheEnable disk /public-api/,验证命中后再扩展
后端响应头是缓存生效的前提
mod_cache_disk 非常严格:默认只缓存带 Cache-Control: public, max-age=... 且不含 Set-Cookie 的 200/301/404 响应。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Spring Boot 示例:
ResponseEntity.ok().header("Cache-Control", "public, max-age=3600").body(data) - 禁止使用
private、no-store、no-cache—— 它们会让缓存直接跳过 - 含用户身份、Session 或 Token 的接口,绝不能加
public,否则有安全风险
绕过限制的常用配置(慎用)
当无法修改后端代码时,可用以下指令放宽条件,但会降低缓存安全性:
-
CacheIgnoreHeaders Set-Cookie Cache-Control:忽略这两个响应头,强制尝试缓存 -
CacheIgnoreNoLastMod on:不依赖Last-Modified头判断新鲜度 -
CacheIgnoreCacheControl off(默认):仍尊重后端的Cache-Control;设为on可完全忽略它
缓存目录与权限必须正确
磁盘缓存不会报错提示路径问题,只会静默失败。
-
CacheRoot /var/cache/apache2/mod_cache_disk目录必须存在,且属主为 Apache 进程用户(如www-data) - 执行:
sudo mkdir -p /var/cache/apache2/mod_cache_disk && sudo chown www-data:www-data /var/cache/apache2/mod_cache_disk - 避免放在
/tmp或 NFS 挂载点上——前者可能被清空,后者不支持原子写入
不复杂但容易忽略










