apache反向代理缓存需启用mod_proxy、mod_cache等模块,配置cacheroot与cacheenable路径,并确保后端返回cache-control: public头,否则缓存不生效。

Apache 通过 httpd.conf 配置反向代理缓存,核心是让 Apache 充当“智能中转站”:接收客户端请求 → 转发给后端 → 把后端返回的响应按规则存下来 → 下次相同请求直接返回缓存,跳过后端。这能显著降低数据库查询、PHP/Python 执行、API 调用等压力。
启用必要模块
在 httpd.conf 开头或模块加载区确认以下行已取消注释(或手动添加):
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-
LoadModule headers_module modules/mod_headers.so(用于验证和调试)
配置磁盘缓存基础路径
在 httpd.conf 的全局或虚拟主机段中加入:
<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>
注意:/var/cache/apache2/mod_cache_disk 目录需提前创建,并确保 Apache 进程(如 www-data 或 apache)有读写权限。
为特定路径启用代理+缓存
例如缓存所有 /api/products 和 /blog/ 下的 GET 请求:
<location> ProxyPass "http://backend-server:8000/api/products" ProxyPassReverse "http://backend-server:8000/api/products" CacheEnable disk CacheIgnoreURLSessionIdentifiers PHPSESSID session_id </location><p><location> ProxyPass "<a href="https://www.php.cn/link/78aeaeb85180eb884e1ca6b280a2447f">https://www.php.cn/link/78aeaeb85180eb884e1ca6b280a2447f</a>" ProxyPassReverse "<a href="https://www.php.cn/link/78aeaeb85180eb884e1ca6b280a2447f">https://www.php.cn/link/78aeaeb85180eb884e1ca6b280a2447f</a>" CacheEnable disk CacheDefaultExpire 1800 </location></p>
关键点:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
CacheEnable disk显式开启该路径的磁盘缓存 -
CacheIgnoreURLSessionIdentifiers忽略 URL 中的会话参数,避免同一页面被多次缓存 - 后端需对这些路径返回
Cache-Control: public, max-age=600等合法头,Apache 才会真正缓存
配合后端设置缓存响应头
Apache 默认只缓存带 public 且含 max-age 或 Expires 的响应。建议在后端代码中统一控制,例如 PHP:
header('Cache-Control: public, max-age=1800');
若后端无法修改,可用 Apache 补充默认策略:
<location>
# ... ProxyPass 等指令
Header merge Cache-Control "public, max-age=1800" "expr=%{resp:Cache-Control} == ''"
</location>
这样即使后端没返回缓存头,Apache 也会按 30 分钟兜底缓存。
验证缓存是否生效
重启 Apache 后,用 curl 检查响应头:
curl -I https://yoursite.com/api/products
成功时应看到:
-
X-Cache: HIT(命中)或X-Cache: MISS(未命中) -
Age:数值大于 0,表示内容来自缓存 -
Cache-Control与后端设置一致
不复杂但容易忽略。










