mod_cache 能缓存 api 响应,但需后端显式设置 public 且含 max-age 的 cache-control,避开 set-cookie、vary:* 等禁止头,并配合 cache_disk 模块与合理配置。

mod_cache 能不能缓存 API 响应?关键看响应头
不能直接缓存,除非 API 响应明确允许。mod_cache 默认跳过所有带 Set-Cookie、Vary: *、Cache-Control: no-store 或 private 的响应;绝大多数后端框架(如 Express、Django、Spring Boot)默认设 Cache-Control: no-cache 或不设,导致 mod_cache 完全不生效。
实操建议:
- 先用
curl -I https://api.example.com/v1/users检查真实响应头,确认Cache-Control是否含public且有max-age - 后端必须显式设置:例如 Express 中加
res.set('Cache-Control', 'public, max-age=60');Spring Boot 可用@ResponseCache(maxAge = 60) - 避免
Vary: Authorization或Vary: Cookie—— 这会让缓存键爆炸式增长,mod_cache 实际不存
启用 disk_cache 而非 mem_cache:稳定性和命中率更可控
mod_cache + mod_cache_disk 是目前 Apache 2.4+ 中唯一推荐的组合;mod_cache_socache 仅作元数据索引,不存正文;而 mod_cache_mem 已被标记为实验性且在多数发行版中默认禁用。
实操建议:
- 确保已加载模块:
a2enmod cache cache_disk(Debian/Ubuntu)或检查LoadModule cache_module和LoadModule cache_disk_module - 配置缓存路径时,目录需由 Apache 进程(如
www-data)可写:CacheRoot /var/cache/apache2/mod_cache_disk - 设合理大小限制:
CacheDirLevels 2和CacheDirLength 1避免单目录文件过多;CacheMaxFileSize 1048576(1MB)防止大响应撑爆磁盘
用 CacheIgnoreHeaders 过滤干扰项,但别乱删 Vary
很多 API 响应带 Vary: Accept-Encoding, User-Agent,但实际业务中 User-Agent 差异对 JSON 响应无意义,反而让同一 URL 缓存多份。这时可针对性忽略,但绝不能全局删 Vary。
实操建议:
- 只忽略确定无关的头:
CacheIgnoreHeaders Vary❌(危险);CacheIgnoreHeaders Accept-Encoding✅(安全,gzip 压缩由 Apache 自行处理) - 若后端已固定返回 UTF-8 JSON,且不依赖
Accept内容协商,可加CacheIgnoreHeaders Accept - 务必配合
CacheIgnoreCacheControl Off—— 否则即使后端写了max-age=300,mod_cache 也会无视
调试缓存是否生效?看日志和响应头里的 X-Cache
mod_cache 不报错也不提示,静默失败是常态。最直接证据是响应头是否出现 X-Cache: HIT 或 X-Cache: MISS,这需要手动注入。
实操建议:
- 在
VirtualHost或Location块中加:Header set X-Cache "MISS" env=cache-miss和Header set X-Cache "HIT" env=cache-hit - 开启 mod_cache 日志:
CacheLock on+CacheLockPath /var/cache/apache2/mod_cache_lock+LogLevel cache:trace4(仅调试时开,性能损耗大) - 注意:
curl请求需带一致的Accept和Accept-Encoding,否则因缓存键不匹配始终 MISS
真正难的不是配参数,而是让后端输出可缓存的响应头——很多团队花半天调 Apache,结果发现 Flask 默认连 Cache-Control 都不发。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










