apache代理缓存需mod_cache、mod_cache_disk(或mod_cache_socache)、mod_proxy及mod_proxy_http协同工作,缺一不可;响应须含cache-control或expires头且满足可缓存状态码等条件才生效。

Apache 的 mod_cache 模块本身不直接支持代理缓存,它仅提供内存或磁盘缓存的底层框架。真正实现代理缓存功能的是 mod_proxy 与 mod_cache 的组合,且必须启用 mod_cache_disk(或 mod_cache_socache)以及 mod_proxy_http 等模块。
代理缓存依赖的核心模块
要让 Apache 在反向代理场景下具备缓存能力,以下模块缺一不可:
-
mod_cache:提供缓存策略、生命周期管理、存储抽象接口 -
mod_cache_disk(推荐)或mod_cache_socache:实现具体缓存存储(磁盘持久化 / 共享内存索引) -
mod_proxy和mod_proxy_http:处理反向代理请求转发 -
mod_expires或响应头(如Cache-Control):控制缓存时效,mod_cache默认仅缓存带明确过期策略的响应
基础代理缓存配置示例
以下是一个典型的反向代理 + 磁盘缓存配置片段(放在 httpd.conf 或虚拟主机中):
# 启用必要模块(确保已加载) LoadModule cache_module modules/mod_cache.so LoadModule cache_disk_module modules/mod_cache_disk.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so <h1>配置磁盘缓存路径(需 Apache 有读写权限)</h1><p>CacheRoot "/var/cache/apache2/mod_cache_disk" CacheEnable disk / CacheDirLevels 2 CacheDirLength 1</p><h1>反向代理设置(假设后端是 <a href="https://www.php.cn/link/cdc10a8cf689568562f9f73cd4f483bd">https://www.php.cn/link/cdc10a8cf689568562f9f73cd4f483bd</a>)</h1><p><proxy> Require all granted </proxy></p><p>ProxyPass / <a href="https://www.php.cn/link/cdc10a8cf689568562f9f73cd4f483bd/">https://www.php.cn/link/cdc10a8cf689568562f9f73cd4f483bd/</a> ProxyPassReverse / <a href="https://www.php.cn/link/cdc10a8cf689568562f9f73cd4f483bd/">https://www.php.cn/link/cdc10a8cf689568562f9f73cd4f483bd/</a></p><h1>强制对某些响应启用缓存(例如 public 且 max-age ≥ 60 秒)</h1><p>CacheIgnoreNoLastMod On CacheIgnoreCacheControl Off CacheIgnoreHeaders Set-Cookie </p>
注意:CacheIgnoreCacheControl Off 表示尊重后端返回的 Cache-Control 头;若后端未设置或设为 no-cache,默认不会缓存。可配合 CacheIgnoreCacheControl On 强制缓存,但需谨慎评估业务一致性。
关键缓存控制逻辑说明
Apache 缓存是否生效,取决于以下条件是否同时满足:
- 请求方法是
GET或HEAD - 响应状态码是
200、203、300、301、410等可缓存状态码(206、404默认不缓存,可通过CacheIgnoreNoLastMod或自定义规则调整) - 响应包含有效的缓存标识:如
Expires头,或Cache-Control中含max-age、s-maxage、public等 - 响应头中不含禁止缓存的字段(如
Cache-Control: private, no-store),除非显式配置CacheIgnoreCacheControl On - URL 不匹配
CacheDisable指令中定义的路径
调试与验证缓存行为
启用缓存日志有助于排查问题:
# 在全局或虚拟主机中添加 CacheLock on CacheLockPath "/var/cache/apache2/mod_cache_lock" CacheLockMaxAge 5 <h1>开启 debug 日志(需 LogLevel debug)</h1><p>LogLevel cache:debug proxy:debug </p>
查看响应头中的 X-Cache(Apache 自动添加)判断是否命中:
-
X-Cache: HIT from example.com→ 缓存命中 -
X-Cache: MISS from example.com→ 未命中,回源获取 - 无
X-Cache头 → 缓存未启用或被跳过
也可用 curl -I http://your-proxy/ 观察 Date、Age、Cache-Control 等头是否符合预期。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










