mod_cache不支持主动预加载,仅被动缓存首次请求响应;需结合外部脚本模拟请求、合理设置Cache-Control、启用mod_cache_disk及后端优化等协同实现预热。

Apache 的 mod_cache 本身不支持主动“预加载”内容,它是一个被动缓存模块,只在客户端首次请求时缓存响应,后续相同请求才命中缓存。所谓“内容预加载”,需要结合其他机制实现,不能单靠 mod_cache 完成。
mod_cache 的定位与限制
mod_cache(含 mod_cache_disk 或 mod_cache_socache)是 Apache 的响应缓存代理模块,工作在反向代理模式下(需配合 mod_proxy)。它:
- 仅对首次访问后返回的可缓存响应(满足
Cache-Control、Expires等头)进行存储; - 不提供定时爬取、后台预热或主动刷新接口;
- 缓存键基于请求 URI、Host、部分请求头(如
Accept),不支持自定义预热逻辑。
实现“预加载”的可行组合方案
若目标是让热门资源提前进入 Apache 缓存,降低用户首访延迟,可采用以下协同方式:
-
用外部脚本模拟请求:通过
curl或 Python 脚本定期请求关键 URL(如首页、商品列表页),触发mod_cache缓存生成; -
配合 mod_proxy + mod_expires 设置合理缓存策略:确保后端返回明确的
Cache-Control: public, max-age=3600,避免因响应头不可缓存导致预热失败; -
启用 mod_cache_disk 并调优磁盘路径与大小:例如配置
CacheRoot /var/cache/apache2/mod_cache_disk和CacheEnable disk /,保证缓存能持久化并快速读取; -
用 mod_headers 注入 Cache-Control(必要时):若后端 Java 应用未设置缓存头,可在 Apache 中强制添加:
Header set Cache-Control "public, max-age=1800"for requests matching specific locations.
Java 后端可配合做的优化
Apache 层的预热效果高度依赖 Java 应用输出的响应是否“适合缓存”。建议后端:
立即学习“Java免费学习笔记(深入)”;
- 对静态资源(JS/CSS/图片)和幂等只读接口(如商品详情、分类列表)返回带
Cache-Control的响应; - 避免在响应中混入用户相关头(如
Set-Cookie),否则mod_cache默认不缓存; - 使用 ETag 或 Last-Modified 配合
mod_cache的条件缓存验证,减少回源带宽; - 若用 Spring Boot,可通过
@ResponseCache(Spring 6+)或WebMvcConfigurer统一配置响应头。
更现代的替代思路
对于需要强预热能力的场景,mod_cache 已显陈旧。可考虑:
- 将 Apache 替换为 nginx + proxy_cache_purge,配合
proxy_cache_path的loader_files参数实现缓存预热; - 在 Java 应用层集成 Caffeine 或 Redis 做本地/分布式热点数据预加载,Apache 仅作轻量代理;
- 使用专门的缓存预热服务(如基于 Quartz 定时调用 Feign Client 请求关键接口)。










