mod_cache_socache 是 mod_cache 的后端存储驱动,仅缓存元数据(如 etag、过期时间)到共享内存,不存响应体;相比 mod_cache_disk,它高并发下更快、无磁盘 i/o,但重启后元数据丢失,需配合 socache 提供器(如 shmcb)使用。

mod_cache_socache 是什么,和 mod_cache_disk 有什么区别
它不是独立缓存模块,而是 mod_cache 的“后端存储驱动”,负责把缓存元数据(比如 ETag、Last-Modified、过期时间)和响应头信息存在共享内存里,而不是磁盘。实际响应体(response body)仍由 mod_cache 自己管理(默认走内存或磁盘),mod_cache_socache 只管“索引”部分。
和 mod_cache_disk 相比,它的优势在高并发下查缓存更快、无磁盘 I/O 竞争;劣势是不持久——Apache 重启后所有缓存元数据丢失,得重新建立。适合缓存周期短、命中率高、对冷启动不敏感的场景(比如 API 响应头频繁变动但内容本身变化不大的接口)。
必须启用的模块和 socache 提供器
光加载 mod_cache_socache 不够,它依赖底层 socache 提供器。常见有:mod_socache_shmcb(基于共享内存的简单实现,无需额外服务)、mod_socache_dbm(用 DBM 文件模拟共享内存,不推荐)、mod_socache_memcache(对接外部 memcached,需额外部署)。
最轻量且开箱即用的是 mod_socache_shmcb,确认已启用:
LoadModule cache_module modules/mod_cache.so<br>LoadModule cache_socache_module modules/mod_cache_socache.so<br>LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
注意顺序:socache 提供器模块(如 socache_shmcb_module)必须在 cache_socache_module 之前加载。
配置 cache_socache 的关键指令
CacheSocache 指令指定使用哪个提供器及参数,例如:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
CacheSocache shmcb:/var/cache/apache2/socache-cache(512000)
其中 shmcb 是提供器名,路径是共享内存段标识(仅作命名,不真写文件),括号内是大小(单位字节)。512KB 对多数中小站点够用;太小会导致缓存条目被频繁淘汰,太大无意义(共享内存段实际按需分配)。
其他要点:
-
CacheQuickHandler off必须显式关闭——否则 Apache 会跳过缓存检查直接交由 quick handler 处理,导致mod_cache_socache完全不生效 -
CacheIgnoreHeaders Set-Cookie建议加上,避免带 Cookie 的请求污染共享缓存(除非你明确要做用户级缓存) - 缓存策略仍由
CacheEnable和CacheIgnoreURLSessionIdentifiers等控制,mod_cache_socache不改变这些逻辑
验证是否生效和常见失败点
开启 mod_info 或查看 error_log 的 debug 级日志(LogLevel cache:debug),留意是否有类似 cache_socache: using provider 'shmcb' 或 cache: running CACHE_SAVE filter 的输出。
典型失败现象和原因:
- 配置后无任何缓存行为 → 检查
CacheQuickHandler off是否漏写,或mod_cache本身未启用CacheEnable - 日志报
socache_shmcb: failed to initialize→ 路径权限不对,或系统限制了共享内存段数量(ipcs -l查看max number of segments) - 缓存命中率低 → socache 只存元数据,真正决定是否复用响应体的是
mod_cache的Vary头处理、ETag 匹配等,和 socache 无关;先确保基础缓存逻辑正确再优化后端
共享内存缓存不保存响应体,也不解决后端慢的问题——它只是让“要不要读缓存”这个判断更快。如果后端响应本身要 2 秒,哪怕缓存查找从 10ms 缩到 0.1ms,用户感知也几乎不变。










