apache本身不直接缓存动态内容,需通过mod_proxy联动mod_cache_disk实现代理级缓存;必须加载proxy、cache及disk模块,配置cacheroot、cacheenable路径、cacheignoreheaders set-cookie,并依赖后端返回public+max-age响应头驱动缓存生效。

Apache 本身不直接缓存动态内容,但可以通过 mod_proxy 联动 mod_cache(尤其是 mod_cache_disk)实现对后端动态响应的代理级缓存。关键不是“让 proxy 缓存”,而是用 proxy 做请求入口和分发器,再由 cache 模块落地存储、复用响应。
配置反向代理并启用磁盘缓存
先确保模块已加载:
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule cache_module modules/mod_cache.soLoadModule cache_disk_module modules/mod_cache_disk.so
在虚拟主机或全局配置中添加缓存根目录与策略:
<ifmodule mod_cache.c><ifmodule mod_cache_disk.c>
CacheRoot "/var/cache/apache2/mod_cache_disk"
CacheDirLevels 2
CacheDirLength 1
CacheMaxExpire 3600
CacheIgnoreHeaders Set-Cookie
CacheIgnoreNoLastMod On
</ifmodule></ifmodule>
注意:缓存目录需存在且 Apache 进程有读写权限;CacheIgnoreHeaders Set-Cookie 可避免因 Cookie 导致缓存失效或泄露用户数据。
按路径或响应头精准启用缓存
仅对适合缓存的动态接口开启,例如公开的 API 列表页、商品详情页(无用户态):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 用
<location></location>包裹缓存指令 - 或配合
CacheEnable disk /api/products显式启用 - 推荐结合后端返回的
Cache-Control头自动判断:若后端返回public, max-age=600,Apache 默认会缓存
避免缓存含用户身份的内容:确保后端对登录态接口(如 /user/profile)返回 private 或 no-store,Apache 会跳过缓存。
控制缓存行为与生命周期
通过响应头驱动缓存逻辑,比硬编码更灵活:
- 后端应用应主动设置
Cache-Control: public, max-age=600(10 分钟)用于低频更新的数据 - 对静态化生成的 HTML 页面,可设
immutable和长周期,如max-age=3600, immutable - 启用
mod_expires作为兜底:对未带Cache-Control的响应,按 MIME 类型补上默认过期时间
示例:
<ifmodule mod_expires.c> ExpiresActive On ExpiresByType text/html "access plus 10 minutes" ExpiresByType application/json "access plus 5 minutes" </ifmodule>
配合后端与运维协同优化
缓存生效依赖前后端一致性:
- 后端需支持
ETag或Last-Modified,便于 Apache 处理协商缓存(304 Not Modified) - 避免后端在响应中混用
Vary: Cookie(除非必要),否则会为每个 Cookie 生成独立缓存副本,浪费空间 - 定期清理过期缓存:可用
find /var/cache/apache2/mod_cache_disk -mmin +60 -delete清理超时文件(建议脚本化+crontab) - 监控缓存命中率:启用
mod_status并关注cache hit/miss统计,验证是否真正减轻后端压力










