Apache大文件缓存必须用mod_cache+mod_cache_disk组合,禁用mod_file_cache;编译需启用--enable-cache和--enable-cache-disk,配置CacheRoot、CacheMaxFileSize及CacheEnable disk /downloads/路径,并配合CacheLock防并发写盘。

Apache 源码编译时加入 cache 模块以支持大文件缓存,关键在于正确编译并启用 mod_cache + mod_cache_disk 组合,而非 mod_file_cache(它不支持大文件,且无法热更新)。mod_file_cache 仅适合小静态文件预加载,而真正处理大文件(如视频、PDF、安装包)缓存,必须依赖磁盘缓存后端(mod_cache_disk),配合核心缓存框架(mod_cache)。
✅ 编译前确认依赖与准备
-
确保系统已安装编译工具链:
gcc,make,autoconf,libtool,pcre-dev(或pcre2-devel)等 - 下载官方源码包(推荐 Apache 2.4.62 或更新稳定版,兼容性好、修复较多缓存相关 bug)
- 解压后进入源码目录,准备配置参数
✅ 配置阶段:启用 cache 相关模块
运行 ./configure 时需显式启用以下模块(默认通常不开启):
./configure \ --prefix=/usr/local/apache2 \ --enable-cache \ --enable-cache-disk \ --enable-headers \ --enable-expires \ --enable-proxy \ --enable-proxy-http \ --enable-rewrite \ --with-included-apr
⚠️ 注意:
--enable-cache是核心框架,必不可少;--enable-cache-disk才能支持大文件落盘缓存(内存缓存 mod_mem_cache 不适合 >10MB 文件);--enable-headers和--enable-expires用于补全/控制响应头,对缓存命中率至关重要;- 若需缓存反向代理的后端响应(如 CDN 回源、大文件服务接口),
--enable-proxy和--enable-proxy-http必须开启。
✅ 编译与安装
make -j$(nproc) sudo make install
安装完成后,检查模块是否存在:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
ls /usr/local/apache2/modules/ | grep -E "(cache|disk|headers|expires)" # 应看到:mod_cache.so、mod_cache_disk.so、mod_headers.so、mod_expires.so 等
✅ 配置大文件缓存的关键要点
1. 启用模块(在 httpd.conf 中)
LoadModule cache_module modules/mod_cache.so LoadModule cache_disk_module modules/mod_cache_disk.so LoadModule headers_module modules/mod_headers.so LoadModule expires_module modules/mod_expires.so
2. 设置缓存根目录(提前创建并授权)
sudo mkdir -p /var/cache/apache2/bigfiles sudo chown www-data:www-data /var/cache/apache2/bigfiles # Ubuntu # 或 sudo chown apache:apache /var/cache/apache2/bigfiles # CentOS
对应配置:
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheRoot "/var/cache/apache2/bigfiles"
CacheDirLevels 2
CacheDirLength 1
CacheMaxFileSize 524288000 # 500MB(单位:字节),按需调大
CacheMinFileSize 10240 # 10KB 起缓存,避免碎片
CacheIgnoreHeaders Set-Cookie
CacheIgnoreNoLastMod On
</IfModule>
</IfModule>3. 对大文件路径启用缓存(例如 /downloads/)
<Location "/downloads/">
CacheEnable disk /
CacheLock on
CacheLockPath "/var/lock/apache2/mod_cache_lock"
CacheLockMaxAge 5
# 强制设置缓存策略(尤其后端不返回标准头时)
<IfModule mod_headers.c>
Header set Cache-Control "public, max-age=86400"
</IfModule>
</Location>? 提示:
CacheEnable disk /中的路径/指的是 Apache 接收请求的 URI 路径,不是文件系统路径;- 若用
ProxyPass代理后端(如 Nginx 或独立文件服务),需确保后端响应含Cache-Control: public, max-age=...,否则 mod_cache_disk 默认跳过缓存;- 大文件建议搭配
CacheLock防止并发首次请求重复写盘。
❌ 不要误用 mod_file_cache 处理大文件
- 它在启动时把整个文件读入内存 → 单个 200MB 文件会让 Apache 内存暴涨,极易 OOM;
- 不支持热更新 → 文件更新后必须重启 Apache,不可接受;
- 无大小限制机制,无并发保护,无 HTTP 协议适配逻辑。
✅ 验证是否生效
- 访问一个大文件 URL(如
http://yourhost/downloads/app-v2.5.0.tar.gz); - 查看响应头是否有
X-Cache: HIT或X-Cache: MISS; - 检查
/var/cache/apache2/bigfiles/下是否生成多级子目录和缓存文件(如a/b/abcdef123...); - 用
du -sh /var/cache/apache2/bigfiles观察缓存体积增长。
不复杂但容易忽略

















