apache的mod_proxy本身不缓存,需协同mod_cache、mod_cache_disk和mod_headers模块,在proxypass路径上通过cacheenable disk绑定路径、忽略set-cookie头、控制cache-control响应头实现反向代理响应缓存。

Apache 的 mod_proxy 本身不负责缓存,但可以和 mod_cache、mod_cache_disk 配合,在反向代理路径上实现响应缓存。关键不是“代理自带缓存”,而是把代理流量接入缓存流水线——需要模块协同、路径匹配、头信息控制三者到位。
启用并确认缓存相关模块
仅靠 mod_proxy 和 mod_proxy_http 无法缓存。必须额外启用:
- mod_cache:缓存框架,必启
- mod_cache_disk:提供磁盘存储后端(推荐用于生产)
- mod_headers:用于清理或覆盖后端 Cache-Control,避免干扰缓存策略
Ubuntu/Debian 执行:sudo a2enmod cache cache_disk headers;RHEL/CentOS 检查 /etc/httpd/conf.modules.d/00-base.conf 中是否取消了对应 LoadModule 行的注释。启用后运行 apache2ctl -M | grep cache 或 httpd -M | grep cache 确认加载成功。
配置缓存区域与代理路径绑定
缓存不是全局生效,必须显式声明哪些请求可缓存。推荐在 <virtualhost></virtualhost> 内用 <cacheenable></cacheenable> 绑定路径:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
CacheEnable disk /:对根路径下所有响应启用磁盘缓存(需配合 ProxyPass) -
CacheEnable disk /api/:只缓存以/api/开头的 GET/HEAD 请求(更安全) - 务必确保
CacheEnable路径与ProxyPass路径前缀一致,否则缓存不命中
示例片段:
<virtualhost><br> ServerName api.example.com<br> ProxyPreserveHost On<br> ProxyPass / http://backend:8080/<br> ProxyPassReverse / http://backend:8080/<br> # 启用缓存(仅对 GET/HEAD 生效)<br> CacheEnable disk /<br> CacheRoot /var/cache/apache2/mod_cache_disk<br> CacheDirLevels 2<br> CacheDirLength 1<br></virtualhost>
控制缓存行为与响应头处理
后端返回的 Cache-Control、Expires、Set-Cookie 会直接影响 Apache 是否缓存。常见干预方式:
- 用
CacheIgnoreHeaders Set-Cookie忽略 Cookie 头(避免因后端设了 Set-Cookie 就拒绝缓存) - 用
Header edit Cache-Control "max-age=.*" "max-age=60"强制统一缓存时长(需 mod_headers) - 添加
CacheIgnoreNoLastMod On允许缓存无 Last-Modified 的响应 - 默认只缓存 2xx/3xx 响应;如需缓存 404,加
CacheIgnoreCacheControl On并配合CacheIgnoreNoLastMod
验证缓存是否生效
最直接的方式是看响应头和磁盘目录:
- 请求返回中出现
X-Cache: HIT或X-Cache: MISS(需手动加:Header set X-Cache "%{cache-status}e") - 检查
CacheRoot目录下是否有生成的文件(如/var/cache/apache2/mod_cache_disk/) - 用
curl -I http://your-proxy/path多次调用,观察Date和Age头变化
注意:缓存不生效常因后端返回了 Cache-Control: private, no-store 或含 Set-Cookie,需先用 CacheIgnoreHeaders 或重写头来绕过。










