apache mod_cache磁盘缓存写入失败主因是模块未加载(mod_cache须在mod_cache_disk前)、cacheroot权限不足或空间不足、响应头不满足缓存条件(如缺cache-control: public、含set-cookie)、未验证命中(需x-cache头或debug日志确认)。
apache mod_cache 磁盘缓存写入失败,通常不是配置语法错误,而是底层权限、路径或响应规则被忽略导致的静默失败。修复重点不在重写指令,而在验证四个关键环节是否全部就绪。
确认 mod_cache 和 mod_cache_disk 模块已正确加载
两个模块缺一不可,且加载顺序必须是 mod_cache 先于 mod_cache_disk:
- Linux/Debian:运行
a2enmod cache cache_disk,再systemctl restart apache2 - RHEL/CentOS:检查
/etc/httpd/conf.modules.d/00-base.conf中两行未被注释:LoadModule cache_module modules/mod_cache.soLoadModule cache_disk_module modules/mod_cache_disk.so - Windows/XAMPP:确认
httpd.conf包含上述两行,且路径指向正确的.so文件 - 验证命令:
httpd -M | grep cache(或apache2ctl -M | grep cache),输出中必须同时出现cache_module和cache_disk_module
检查 CacheRoot 目录权限与文件系统限制
这是最常见却最容易被日志掩盖的原因——Permission denied: cache: store_headers failed 就指向这里:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 目录必须由 Apache 进程用户(如
www-data、apache或daemon)拥有读写权限:sudo chown -R www-data:www-data /var/cache/apache2/mod_cache_disk - 目录不能位于
/tmp(可能被自动清理)、NFS/Samba/OneDrive 同步目录(不支持原子写入)、NTFS 加密卷或 FAT32 分区 - 确保磁盘剩余空间 ≥5GB;
mod_cache_disk不自动清理过期文件,空间耗尽后写入即失败 - 手动测试写入:
sudo -u www-data touch /var/cache/apache2/mod_cache_disk/testfile,若报错则说明权限或挂载选项有问题
确保后端响应满足缓存前提条件
即使模块和路径都正确,Apache 默认会跳过绝大多数动态响应:
- 响应状态码必须是可缓存类型:200、301、302、410、414(404 和 500 默认不缓存)
- 响应头中必须含
Cache-Control: public, max-age=300(仅max-age不够,public是关键) - 响应头中不能含
Set-Cookie、Cache-Control: private/no-store、Vary: * - 用
curl -I https://yoursite.com/api/data实际抓包验证返回头;若后端无法修改,可用CacheIgnoreHeaders Set-Cookie强制忽略(但需确认业务无状态)
验证缓存是否真正命中
不要只看 error.log 是否报错,要主动观测命中行为:
- 在 Apache 配置中加入:
Header set X-Cache "MISS" env=cache_missHeader set X-Cache "HIT" env=cache_hit - 重启 Apache 后发起两次相同请求,用
curl -I查看响应头中X-Cache值是否从MISS变为HIT - 启用 debug 日志临时排查:
LogLevel cache:debug,观察 error.log 中是否有cache: Caching url和cache: Stored headers/body类似记录 - 注意:
htcacheclean工具可列出当前缓存项,运行htcacheclean -D -p /var/cache/apache2/mod_cache_disk -n查看结构是否生成









