Apache mod_cache可缓存API响应,但需后端显式设置Cache-Control: public, max-age、禁用Set-Cookie与Vary: *,并配置CacheIgnoreCacheControl Off等关键项,否则静默跳过。

Apache 的 mod_cache 能缓存 API 动态响应,但不是“开箱即用”,必须后端明确授权、配置精准匹配、规避默认拦截规则,否则静默跳过——这是绝大多数人配置失败的根本原因。
API 响应必须显式声明可缓存
mod_cache 默认拒绝缓存绝大多数 API 响应,因为它会检查三个硬性条件:
-
Cache-Control 头必须含 public 且带 max-age(或 s-maxage):例如
Cache-Control: public, max-age=60;仅写max-age=60或no-cache都不生效 - 不能含 Set-Cookie、Vary: *:Set-Cookie 表示响应含用户私有状态,默认禁用缓存;Vary: * 让缓存键失去意义,直接放弃缓存
-
状态码需在默认可缓存列表中:200、301、302 等可以,404、500、401 默认不缓存(除非额外配置
CacheStorePrivate On,但不推荐用于 API)
实操建议:用 curl -I https://your-api.com/v1/data 查看真实响应头。若返回 Cache-Control: no-cache 或缺失该头,说明后端未配合,Apache 不会缓存。
后端代码必须主动设置缓存策略
不要依赖 Apache 自动加头,缓存控制权必须由 API 逻辑决定。不同框架示例:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
Express(Node.js):
res.set('Cache-Control', 'public, max-age=300') -
Spring Boot:在 Controller 方法上加
@ResponseCache(maxAge = 300),或手动response.setHeader("Cache-Control", "public, max-age=300") -
Java Servlet:
response.setHeader("Cache-Control", "public, s-maxage=300")(s-maxage 优先级高于 max-age,专用于共享缓存)
避免陷阱:不要返回 Cache-Control: private;不要为每个请求动态生成 ETag 或 Last-Modified(除非内容真实变化),否则缓存命中率归零。
Apache 配置要精简、安全、可落地
推荐使用 mod_cache_disk(稳定、可控),禁用 mod_cache_mem(实验性、多数发行版已弃用)。关键配置项:
-
启用模块:Debian/Ubuntu 运行
a2enmod cache cache_disk headers;CentOS/RHEL 确保LoadModule cache_module和cache_disk_module已加载 -
基础路径与结构:
<IfModule mod_cache.c> <IfModule mod_cache_disk.c> CacheRoot "/var/cache/apache2/mod_cache_disk" CacheDirLevels 2 CacheDirLength 1 CacheMaxFileSize 1048576 </IfModule> </IfModule> -
启用缓存并过滤干扰:在
<Location "/api/">或对应路径块中配置:CacheEnable disk CacheIgnoreHeaders Set-Cookie CacheIgnoreHeaders Vary CacheIgnoreCacheControl Off
注意:只在确认 API 不设 Cookie、且 Vary 头无实际区分意义时才忽略 Vary;CacheIgnoreCacheControl Off是必须项,否则后端的 max-age 会被无视
验证是否真正生效
mod_cache 不报错、不提示,全靠响应头和日志判断:
-
看响应头:成功命中缓存时,Apache 会自动添加
X-Cache: HIT from example.com;未命中则为X-Cache: MISS -
查错误日志:开启
CacheLock on后,若并发请求触发锁等待,会在 error_log 中记录cache lock acquired类信息 -
观察磁盘缓存目录:执行请求后,检查
/var/cache/apache2/mod_cache_disk/下是否有新生成的文件(注意权限:目录需属 www-data 或 apache 用户且可写)
不复杂但容易忽略——只要后端头写对、Apache 模块启对、配置里没漏掉 CacheIgnoreCacheControl Off,高频重复 API 请求就能稳稳落到磁盘缓存上,减轻后端 70%+ 压力。

















