Apache的mod_cache需与mod_proxy协同配置并依赖后端HTTP缓存头才能正常工作,否则易致缓存污染、内容陈旧或503错误;必须加载mod_cache、mod_cache_disk、mod_proxy、mod_proxy_http模块,且缓存策略由后端响应头(如Cache-Control、ETag)驱动,不可强制缓存。

Apache的mod_cache在反向代理架构中并非“开箱即用”的缓存方案,它需要与mod_proxy协同配置,并严格遵循缓存语义(如HTTP头、过期策略、验证机制),否则容易出现缓存污染、内容陈旧或503错误等问题。
核心前提:启用并串联关键模块
mod_cache本身不处理网络代理,必须搭配mod_proxy及其子模块(如mod_proxy_http)使用。同时需加载mod_cache_disk(磁盘缓存)或mod_cache_socache(共享对象缓存)来提供实际存储能力。
- 确认Apache启动时已加载:
mod_cache、mod_cache_disk、mod_proxy、mod_proxy_http - 典型加载方式(
httpd.conf或mods-enabled中):LoadModule cache_module modules/mod_cache.soLoadModule cache_disk_module modules/mod_cache_disk.soLoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.so - 模块加载顺序无硬性要求,但
mod_cache必须在mod_proxy之后生效(因缓存指令常作用于proxy路径)
缓存策略必须由后端响应驱动
mod_cache默认不缓存任何响应,它严格依赖后端返回的HTTP缓存头(如Cache-Control、Expires、Last-Modified、ETag)来决定是否缓存、缓存多久、是否可验证。不能靠Apache单方面设置“强制缓存”。
- 后端应用必须输出符合语义的响应头,例如:
Cache-Control: public, max-age=3600→ 可被共享缓存(如Apache)保存1小时Cache-Control: private, max-age=600→ 默认不被mod_cache缓存(需显式配置CacheIgnoreNoLastMod On等绕过限制) - 若后端无法修改,可在Apache中用
Header指令注入(仅限调试,不推荐生产):ProxyPass /app http://backend:8080/<Location "/app">
Header set Cache-Control "public, max-age=300"</Location> - 注意:
mod_cache会忽略无Last-Modified或ETag的响应(除非配置CacheIgnoreNoLastMod On),否则无法支持条件重验证(304 Not Modified)
反向代理缓存的关键配置段
缓存行为通过<IfModule cache_module>和<CacheEnable disk />等指令控制,且必须与ProxyPass路径对齐。
立即学习“Java免费学习笔记(深入)”;
- 启用磁盘缓存并指定根目录:
CacheRoot "/var/cache/apache2/mod_cache_disk"CacheEnable disk /→ 对所有路径启用缓存(谨慎!建议限定路径) - 精准控制某代理路径缓存:
ProxyPass "/api" "http://api-server:9000/"<Location "/api">
CacheEnable disk
CacheIgnoreHeaders Set-Cookie→ 避免因Cookie头导致不缓存
CacheIgnoreCacheControl On→ (慎用)忽略客户端Cache-Control: no-cache请求头 - 缓存清理依赖
CacheLock和CacheLockPath防止并发写冲突,生产环境建议开启:CacheLock onCacheLockPath "/var/cache/apache2/mod_cache_lock"
调试与验证要点
缓存是否生效不能只看响应时间,要观察HTTP头变化和磁盘缓存文件生成。
- 检查响应头是否含
X-Cache: HIT或X-Cache: MISS(需手动添加):Header append X-Cache "HIT" env=cache_hitHeader append X-Cache "MISS" env=cache_miss - 确认缓存目录有文件生成(如
/var/cache/apache2/mod_cache_disk/下出现哈希命名的文件) - 用
curl -I反复请求同一资源,观察Date、Age、X-Cache是否变化;Age值递增说明命中缓存 - 常见失败原因:
后端返回Set-Cookie(触发CacheIgnoreHeaders未配置)
响应状态码非200/203/300/301/302/410(需用CacheIgnoreNoLastMod或CacheStorePrivate扩展)
磁盘空间不足或权限错误(Apache用户需有CacheRoot写权限)










