apache源码编译cache模块需协同编译mod_cache与底层存储模块(如mod_disk_cache),并链接cache_util.c等公共工具文件,缺一不可;加载顺序须cache_module在前,且cacheenable路径匹配代理接收路径。

Apache 源码编译集成 cache 模块不是简单加一个 --enable-cache 就能用,它依赖多个协同模块的联合编译与正确链接。单独编译 mod_cache.so 会报错(如 undefined symbol: cache_generate_key_default),因为 mod_cache 是框架层,必须和底层存储模块(如 mod_disk_cache 或 mod_mem_cache)共用核心缓存工具函数。
必须一起编译的核心源文件组
mod_cache.c 本身不包含完整实现,它依赖 cache_*.c 系列工具文件。以下三组是生产环境最常用、且经验证可稳定工作的编译组合:
-
mod_cache+mod_disk_cache(磁盘缓存)apxs -c -i -a mod_cache.c \ cache_util.c \ cache_cache.c \ cache_storage.c \ cache_pqueue.c \ cache_hash.c \ mod_disk_cache.c -
mod_cache+mod_mem_cache(内存缓存)apxs -c -i -a mod_cache.c \ cache_util.c \ cache_cache.c \ cache_storage.c \ cache_pqueue.c \ cache_hash.c \ mod_mem_cache.c -
mod_cache+mod_file_cache(静态文件预加载)apxs -c -i -a mod_cache.c \ cache_util.c \ cache_cache.c \ cache_storage.c \ cache_pqueue.c \ cache_hash.c \ mod_file_cache.c
⚠️ 注意:
mod_file_cache虽名义上“独立”,但 Apache 2.4+ 中它实际调用mod_cache的内部 API,因此也需链接上述公共文件,否则启动时报undefined symbol错误。
编译前确认源码完整性
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
进入 Apache 源码目录的 modules/cache/,确保存在以下关键 .c 文件:
-
mod_cache.c,mod_disk_cache.c,mod_mem_cache.c,mod_file_cache.c -
cache_util.c,cache_cache.c,cache_storage.c,cache_pqueue.c,cache_hash.c
缺失任一文件,编译将失败或运行时崩溃。
编译后验证是否真正可用
仅 apxs -i 成功不代表模块就绪。必须检查:
模块是否被正确载入:
httpd -M | grep cache
✅ 正确输出应含cache_module和cache_disk_module(或cache_mem_module、file_cache_module)
❌ 若只出现其一,说明某模块未成功加载或路径错误-
缓存目录权限是否就位(对
mod_disk_cache):sudo mkdir -p /usr/local/apache2/cache sudo chown daemon:daemon /usr/local/apache2/cache # 根据你的 Apache 运行用户调整
配置中启用顺序不可颠倒:
LoadModule cache_module modules/mod_cache.so
必须在LoadModule cache_disk_module modules/mod_disk_cache.so之前
配置示例(磁盘缓存)
<ifmodule mod_cache.c><ifmodule mod_disk_cache.c>
CacheRoot "/usr/local/apache2/cache"
CacheDirLevels 2
CacheDirLength 1
CacheMaxExpire 3600
CacheIgnoreHeaders Set-Cookie
CacheIgnoreNoLastMod On
</ifmodule></ifmodule>
# 在虚拟主机或 Location 中启用
<location>
CacheEnable disk /
ProxyPass "http://backend:8080/api/"
ProxyPassReverse "http://backend:8080/api/"
</location>
? 关键点:
CacheEnable disk /的路径匹配的是 Apache 接收到的请求路径(即/api/),不是后端真实地址;且必须搭配mod_proxy才能缓存代理响应。
不复杂但容易忽略:源码编译缓存模块,本质是“编译一个功能链”,而非单个模块。漏掉任意一个 .c 文件或加载顺序错位,都会导致缓存静默失效。










