mod_cache_disk未生效的主因是模块未正确加载或配置错误。需确保mod_cache在mod_cache_disk前加载,cacheroot权限与空间充足,响应头符合缓存规则,并通过x-cache响应头或error.log日志验证命中。

mod_cache_disk 为什么没生效?先确认模块已加载
Apache 的磁盘缓存不会自动启用,mod_cache 和 mod_cache_disk 必须显式加载,且顺序不能错——mod_cache 必须在 mod_cache_disk 之前。常见错误是只启用了后者,或用 LoadModule 加载时路径写错(尤其在 Debian/Ubuntu 的 /etc/apache2/mods-available/ 下启用了 cache_disk.load 却没启用 cache.load)。
验证方式:运行 apache2ctl -M | grep cache(Linux)或 httpd -M | grep cache(RHEL/CentOS),应同时看到 cache_module 和 cache_disk_module。
- Debian/Ubuntu:执行
a2enmod cache cache_disk,再systemctl restart apache2 - RHEL/CentOS:检查
/etc/httpd/conf.modules.d/00-base.conf中两行LoadModule是否存在且未被注释 - Windows:确认
httpd.conf中有LoadModule cache_module modules/mod_cache.so和LoadModule cache_disk_module modules/mod_cache_disk.so
CacheRoot 路径权限和空间够不够?
CacheRoot 指定的目录必须由 Apache 进程用户(如 www-data 或 apache)可读写,且剩余空间建议 ≥5GB——缓存文件不清理会持续增长,mod_cache_disk 本身不提供自动过期清理机制(它依赖 CacheIgnoreCacheControl 和响应头中的 Cache-Control 或 Expires 判断是否缓存,但不主动回收磁盘空间)。
典型配置:
CacheRoot /var/cache/apache2/mod_cache_disk CacheEnable disk / CacheIgnoreCacheControl off
- 确保
/var/cache/apache2/mod_cache_disk存在,并执行chown www-data:www-data /var/cache/apache2/mod_cache_disk(Debian/Ubuntu) - 避免设在
/tmp下——某些系统会定期清空,导致缓存丢失 - 不要设为 NFS 或 FUSE 挂载点——
mod_cache_disk依赖本地文件系统原子操作,NFS 可能引发缓存损坏或性能骤降
哪些响应会被真正缓存?看 CacheIgnoreHeaders 和 CacheIgnoreCacheControl
默认情况下,mod_cache_disk 遵守后端响应头:Cache-Control: no-store、Set-Cookie 头存在、状态码非 200/203/300/301/302/410/414 就直接跳过缓存。这意味着 PHP 输出的带 Set-Cookie 的页面、API 返回的 Cache-Control: private 响应,全都不会落盘。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
若你控制后端,推荐显式设置响应头;若无法修改后端,可用以下策略放宽限制(慎用):
- 加
CacheIgnoreCacheControl on强制忽略客户端请求头(如Cache-Control: no-cache),但不忽略响应头 - 加
CacheIgnoreHeaders Set-Cookie跳过对Set-Cookie的拦截——适合静态化内容但后端误加了 Cookie 的场景 - 用
CacheLock on+CacheLockPath /var/cache/apache2/mod_cache_disk.lock防止并发请求重复生成同一缓存(尤其对慢后端重要)
如何验证缓存是否命中?看响应头和日志
仅靠浏览器刷新看不出效果。mod_cache_disk 成功命中时,响应头会多出 X-Cache: HIT from example.com(需手动添加 Header set X-Cache "HIT from %{SERVER_NAME}e" 配合 CacheIgnoreCacheControl 等条件);未命中则为 X-Cache: MISS。更可靠的方式是查 Apache 的 cache 日志:
CacheQuickHandler off CacheIgnoreNoLastMod On CacheDetailHeader on LogLevel cache:trace4
然后查 error.log,搜索 cache_disk: 关键字,能看到类似 cache_disk: Caching URL /api/data.json 或 cache_disk: Serving cached response for /static/logo.png 的记录。
注意:CacheQuickHandler on(默认)会导致 HEAD 请求不走缓存逻辑,调试时建议关掉;另外,mod_cache_disk 不缓存 POST 请求,无论你怎么配。
缓存文件结构是哈希散列的子目录(如 /a/b/cdef1234567890...),别手动删,用 find /var/cache/apache2/mod_cache_disk -type f -mtime +7 -delete 定期清理旧文件更安全。










