Apache的DocumentRoot与mod_cache反向代理缓存互斥:前者服务本地静态文件,后者缓存后端代理响应;二者路径必须严格分离,不可混用同一URL路径,但可通过清晰的路径划分(如/static/走DocumentRoot、/api/走ProxyPass+CacheEnable)实现分层协作。

Apache 的 DocumentRoot 和反向代理缓存(mod_cache)本质上是互斥路径:DocumentRoot 服务的是本地静态文件(如 HTML、CSS、JS),而反向代理(ProxyPass)把请求转发给后端,绕过 DocumentRoot。
所以不能“配合使用”同一路径,但可以分层协作——关键在于路径划分清晰、缓存策略按需施加。
✅ 明确角色分工:DocumentRoot 不参与代理缓存
-
DocumentRoot "/var/www/html"只响应未被ProxyPass拦截的请求(比如/static/,/favicon.ico)。 - 所有被
ProxyPass /api/ http://backend/拦截的请求,完全不经过 DocumentRoot,也不会读取本地文件。 -
mod_cache缓存的是代理响应(即后端返回的内容),不是 DocumentRoot 下的文件。
⚠️ 常见误区:以为给
DocumentRoot加CacheEnable就能缓存代理内容 —— 实际无效,因为代理请求根本不会落到该目录。
✅ 正确配置反向代理 + 缓存的三步结构
1. 启用并隔离缓存路径
只对明确需要缓存的代理路径启用 mod_cache_disk,避免污染或误缓存:
# 启用必要模块(确认已加载) 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 # 全局缓存配置(可选,建议放 <IfModule> 块内) <IfModule mod_cache.c> CacheLock on CacheIgnoreHeaders Set-Cookie CacheIgnoreNoLastMod On CacheMaxFileSize 1048576 CacheMinFileSize 1 </IfModule> <IfModule mod_cache_disk.c> CacheRoot /var/cache/apache2/mod_cache_disk CacheDirLevels 2 CacheDirLength 1 </IfModule>
2. 在 ProxyPass 路径上显式启用缓存
仅对 /api/ 或 /content/ 这类后端接口启用缓存,且必须配合 CacheEnable 指令:
<VirtualHost *:80>
ServerName example.com
# 静态资源走 DocumentRoot(不缓存或用浏览器缓存)
DocumentRoot /var/www/html
<Directory "/var/www/html">
Require all granted
</Directory>
# 动态 API 走代理 + 服务端缓存
<Location "/api/">
ProxyPass http://backend:3000/
ProxyPassReverse http://backend:3000/
# 关键:在此 Location 内启用磁盘缓存
CacheEnable disk
CacheIgnoreCacheControl off # 尊重后端 Cache-Control
CacheIgnoreNoLastMod Off
</Location>
# 可选:对特定静态子路径也缓存(如 /assets/),但注意它仍走 DocumentRoot
<Location "/assets/">
# 此处不 ProxyPass,所以 DocumentRoot 生效;可加 Expires 或 Cache-Control 头
Header set Cache-Control "public, max-age=31536000"
</Location>
</VirtualHost>3. 控制缓存行为靠后端响应头(最可靠方式)
Apache mod_cache 不主动设置 TTL,而是依赖后端返回的 HTTP 头:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- ✅ 推荐:后端返回
Cache-Control: public, max-age=600→ Apache 缓存 10 分钟 - ✅ 强制跳过缓存:后端返回
Cache-Control: no-cache, private→ Apache 绝不缓存 - ❌ 避免仅靠
CacheDefaultExpire:它只是兜底值,无法覆盖后端明确声明
? 提示:若后端无法控制响应头,可在 Apache 中用
Header edit或SetEnvIf临时干预,但优先改造后端。
✅ DocumentRoot 的静态文件怎么缓存?
它不走 mod_cache_disk,但可通过以下方式高效缓存:
- 使用
mod_expires设置浏览器缓存:<Directory "/var/www/html"> ExpiresActive On ExpiresByType text/css "access plus 1 year" ExpiresByType application/javascript "access plus 1 year" ExpiresByType image/jpg "access plus 1 month" </Directory>
- 或用
mod_headers直接注入Cache-Control:<FilesMatch "\.(css|js|gif|jpe?g|png)$"> Header set Cache-Control "public, max-age=31536000" </FilesMatch>
这类缓存发生在客户端(浏览器),与 mod_cache_disk 的服务端缓存完全分离,互不干扰。
不复杂但容易忽略:DocumentRoot 和反向代理缓存是两条平行线,设计时先划清边界——什么走本地、什么走后端、什么该缓存、由谁控制缓存寿命。

















