Apache mod_cache不直接被Java应用使用,而是作为反向代理层与CDN、Java应用构成三层缓存体系;需配置mod_cache与Proxy联动,Java应用输出规范Cache-Control头,CDN遵循源站缓存指令,实现协同缓存。

Java应用本身不直接使用 Apache 的 mod_cache,因为 mod_cache 是 Apache HTTP Server(即 Web 服务器层)的模块,运行在 Java 应用(如 Tomcat、Jetty)之前。要实现“Apache mod_cache + CDN”的边缘缓存策略,本质是构建一个三层缓存体系:CDN(最外层)、Apache reverse proxy + mod_cache(中间层)、后端 Java 应用(源站)。关键在于各层缓存行为的一致性与协作。
明确各层职责与缓存边界
CDN 缓存静态资源(JS/CSS/图片等)和部分动态内容(如带 Cache-Control 的 API 响应),Apache mod_cache 主要用于:
- 缓存 Java 应用未覆盖的响应(例如反向代理到多个后端时的统一缓存)
- 对特定路径做细粒度缓存控制(如 /api/v1/public/**)
- 补充 CDN 未命中或需私有缓存的场景(如用户级可缓存数据)
注意:mod_cache 默认不缓存 POST、带有 Set-Cookie 或 Vary: Cookie 的响应,需按需配置。
Apache 配置 mod_cache 与反向代理联动
确保 Apache 启用 mod_cache、mod_cache_disk、mod_proxy、mod_proxy_http。典型配置示例:
# 启用磁盘缓存
CacheRoot "/var/cache/apache2/mod_cache"
CacheEnable disk /
CacheIgnoreNoLastMod On
CacheIgnoreCacheControl Off
CacheIgnoreHeaders Set-Cookie
CacheMaxFileSize 1048576
# 反向代理到 Java 应用(如 Tomcat)
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
# 对特定路径启用缓存并设置 TTL
CacheIgnoreCacheControl Off
CacheIgnoreHeaders Set-Cookie
CacheMaxExpire 3600
CacheIgnoreURLSessionIdentifiers jsessionid
Java 应用侧配合要点
Java 应用需主动输出标准缓存响应头,让 Apache 和 CDN 共同识别:
- 对可公开缓存的响应,设置
Cache-Control: public, max-age=3600(而非 private 或 no-store) - 避免无意义的
Set-Cookie;若必须设 Cookie,考虑分离缓存路径(如 /public/xxx 不设 Cookie) - 使用
Vary头谨慎:如需按 Accept-Encoding 缓存,设Vary: Accept-Encoding;但避免Vary: Cookie或Vary: Authorization导致缓存碎片化 - 对资源加版本号或哈希(如
main.a1b2c3.js),使 CDN 和 Apache 可长期缓存(max-age=31536000)
CDN 与 Apache 缓存协同的关键实践
为防止多层缓存语义冲突,建议:
- CDN 设置为“遵循源站 Cache-Control”,而非强制覆盖;Apache 作为源站,需输出准确的
Cache-Control和Expires - CDN 开启 “Edge Cache TTL” 时,优先信任 Apache 返回的
Cache-Control,仅对无缓存头的响应设默认 TTL - Apache 的
CacheIgnoreCacheControl Off确保尊重 Java 应用的缓存指令;若需覆盖,仅在 Location 块中局部调整 - 通过请求头标识缓存层级(如
X-Cache: Apache-HIT、X-Cache: CDN-MISS),便于链路追踪和问题排查
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










