apache的mod_cache_disk不专为海量小文件优化,需调优cachedirlevels/cachedirlength、使用xfs/ext4文件系统、精确配置cacheenable路径、忽略set-cookie/vary头,并由后端返回public缓存头。

Apache 的 mod_cache_disk 本身不是为“海量小文件”场景专门优化的,它默认按 URI 生成缓存键、用多级子目录组织文件(CacheDirLevels × CacheDirLength ≤ 20),在小文件密集时容易出现单目录 inode 过多、文件系统查找变慢、磁盘 I/O 随机化加剧等问题。要真正实现海量小文件(如图标、字体、JS/CSS 拆包后资源)的加速,需针对性调优,而非直接套用默认配置。
确保模块加载顺序与基础可用性
必须同时启用且顺序正确:
-
mod_cache必须在mod_cache_disk之前加载,否则启动报错(undefined symbol) - Debian/Ubuntu:运行
a2enmod cache cache_disk;CentOS/RHEL:确认/etc/httpd/conf.modules.d/00-base.conf中两行LoadModule均未被注释 - Windows(如 phpEnv):检查
modules/目录下是否存在mod_cache_disk.so(2.4+)或mod_disk_cache.so(2.2),并验证httpd -M | findstr cache同时输出cache_module和cache_disk_module
优化 CacheRoot 结构与文件系统适配
海量小文件对目录深度和底层文件系统敏感:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 设
CacheDirLevels 3+CacheDirLength 4(共 12 层字符),使缓存路径更分散,避免单目录超 10k 文件(ext4 默认限制) - CacheRoot 必须挂载在支持高 inode 密度的本地文件系统上(如 XFS 或 ext4 with
-i size=2048格式化),禁用 NFS/FUSE - 预留充足空间(建议 ≥20GB),并定期用
htcacheclean清理过期项(mod_cache_disk不自动回收磁盘) - 权限务必设为 Apache 进程用户可读写:
chown www-data:www-data /var/cache/apache2/mod_cache_disk(Debian)或chown apache:apache /var/cache/httpd(RHEL)
收紧缓存范围,专注小文件路径
不要全局缓存(CacheEnable disk /),而是精确匹配静态资源路径:
- 只对明确无状态、无 Cookie、不带用户上下文的小文件启用:
<location> CacheEnable disk /static/ </location> - 显式忽略干扰头:
CacheIgnoreHeaders Set-Cookie Vary(Vary 头若频繁变动会爆炸式增加缓存副本) - 设置合理大小边界:
CacheMinFileSize 256(跳过极小响应,如空 204)、CacheMaxFileSize 2097152(2MB,防大文件挤占) - 关闭
CacheIgnoreNoLastMod On—— 小文件通常有 Last-Modified,保留它能提升条件 GET 命中率
配合响应头与前端策略协同生效
缓存是否落盘,最终取决于后端返回的响应头:
- Java/Spring Boot 等后端需显式返回:
Cache-Control: public, max-age=86400(不能是private或含no-store) - 静态资源服务(如 Apache 自己托管的
/static/)应搭配mod_expires补充头:ExpiresByType image/png "access plus 1 year" - 用
curl -I检查响应头是否含X-Cache: HIT或MISS,并观察Cache-Control是否符合预期 - 浏览器开发者工具 Network 面板查看
from disk cache或from memory cache,确认客户端也复用成功










