apache mod_cache_disk需与mod_proxy_http协同工作才能缓存java后端响应,必须启用proxy、cache、cache_disk、headers、expires模块,配置cacheenable disk指向代理路径,并确保java响应含public+max-age头且无set-cookie。

Apache 本身不支持“主动预热”缓存,mod_cache 是被动缓存模块,只在首次请求响应后才存入;但通过 mod_proxy + mod_cache_disk 配合外部触发机制,可以实现静态资源的准预热和一致性管理。关键不在 Apache 单独发力,而在链路协同与头信息控制。
必须启用的核心模块与基础配置
mod_cache_disk 无法独立工作,必须与 mod_proxy(尤其是 mod_proxy_http)配合,才能拦截并缓存反向代理返回的响应。缺一不可:
- LoadModule proxy_module modules/mod_proxy.so
- LoadModule proxy_http_module modules/mod_proxy_http.so
- LoadModule cache_module modules/mod_cache.so
- LoadModule cache_disk_module modules/mod_cache_disk.so
- LoadModule headers_module modules/mod_headers.so
- LoadModule expires_module modules/mod_expires.so
仅启用模块还不够——需确保 CacheEnable disk 指向的是代理路径(如 /static/),而非后端真实路径。例如 ProxyPass /static/ http://backend:8080/static/,则缓存指令应为 CacheEnable disk /static/,不是 /api/ 或根路径 /。
让静态资源“可被缓存”的硬性条件
Java 后端返回的响应若不满足 Apache 的缓存准入规则,mod_cache_disk 会直接跳过,X-Cache 始终为 MISS。必须同时满足:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 状态码为 200、301、404 等允许缓存的类型
- 响应头含 Cache-Control: public, max-age=N(仅 max-age 不够,必须带 public)
- 不含 Set-Cookie 头(否则默认丢弃;可用
CacheIgnoreHeaders Set-Cookie强制忽略) - 建议启用
CacheIgnoreNoLastMod On,避免因缺少 Last-Modified 而拒存
若 Java 应用未设置响应头,可在 Apache 中补全:Header set Cache-Control "public, max-age=31536000, immutable" env=IS_STATIC
再用 SetEnvIf 判断路径匹配静态资源(如 \.(js|css|png|woff2)$)来设环境变量。
模拟请求实现“软预热”
没有后台爬虫,就用轻量脚本定期触发关键资源访问,让缓存自然生成:
- 用 curl 或 wget 批量请求常用静态路径,例如:
curl -I https://yoursite.com/static/app.a1b2c3.js - 放入 cron 定时任务(如每天凌晨执行),覆盖首页、核心 JS/CSS、字体、图标等高频资源
- 配合健康检查:请求后检查响应头是否含
X-Cache: HIT或X-Cache-Detail: cached,确认已落盘
注意:该方式不是“秒级预热”,但能显著降低用户首访延迟,尤其适合发布后快速填充热点资源。
保障版本一致性:靠构建+路径,不靠重写
静态资源更新靠文件名哈希(如 main.8f3e7a.js),而非 URL 重写。Apache 只需做到“不干扰”:
- 关闭 MultiViews(
Options -MultiViews),防止 Apache 尝试匹配 .gz/.br 变体失败 - 确保 DocumentRoot 指向构建产物目录(如 /var/www/html/dist),且文件权限对 www-data 可读
- 不配置任何 mod_rewrite 规则去“映射旧名到新名”——前端代码应直接引用带哈希的真实文件名
- CDN 和浏览器均依据 Cache-Control: public, max-age=31536000 缓存,一旦文件名变更,即视为全新资源,天然绕过旧缓存
这种模式下,缓存一致性由构建流程保证,Apache 只负责高效交付,不引入额外逻辑风险。









