mod_cache_socache通过共享内存缓存元数据(如etag、过期时间)实现跨子进程静态资源缓存决策,需按socache_shmcb→cache_socache→cache→cache_disk顺序加载模块,配合cachesocache、cacheenable disk、cachequickhandler off等指令,并依赖响应头、url规范及缓存策略共同生效。
在虚拟主机中配置 mod_cache_socache 实现跨子进程的静态资源缓存,核心在于让多个 apache 工作进程共享同一套缓存元数据,从而避免重复校验、提升高频请求下的响应一致性。它不存文件内容,只管“要不要读缓存”或“要不要回源”的决策信息(如 etag、last-modified、过期时间),所以必须搭配主缓存后端(如 mod_cache_disk)才能真正加速静态资源交付。
必须启用的模块与加载顺序
Apache 模块依赖严格,顺序错会导致 mod_cache_socache 静默失效:
-
mod_socache_shmcb必须最先加载——它是共享内存提供器,mod_cache_socache依赖它创建共享段 -
mod_cache_socache紧随其后——作为mod_cache的元数据存储驱动 -
mod_cache和mod_cache_disk(或mod_cache_memory)最后加载——负责实际响应体缓存
在 httpd.conf 或虚拟主机配置前确认已启用:
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule cache_socache_module modules/mod_cache_socache.so
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
虚拟主机内关键配置项
以下指令需写在 <virtualhost></virtualhost> 块内,且不能嵌套在 <directory></directory> 或 <location></location> 中(部分指令仅支持 server/vhost 级别):
-
CacheSocache shmcb:/var/cache/apache2/socache-vhost(512000):指定共享内存段标识和大小;Linux 下路径仅为命名,Windows 推荐用简短名如
shmcb:/vhost-cache(512000) -
CacheEnable disk /:启用磁盘缓存主后端,路径由全局
CacheRoot控制;mod_cache_socache本身不提供响应体存储 - CacheQuickHandler off:强制 Apache 进入完整请求处理流程,否则所有请求绕过缓存逻辑
- CacheIgnoreHeaders Set-Cookie:防止带 Cookie 的请求生成独立缓存键,保障静态资源(如 CSS/JS/图片)被统一缓存
静态资源缓存生效的前提条件
即使配置正确,静态资源也不会自动被缓存,需满足三方面要求:
-
响应头明确可缓存:Apache 默认只缓存含
Cache-Control或Expires的 200/301/404 响应;对静态文件,建议用mod_expires统一设置:ExpiresByType text/css "access plus 1 hour"ExpiresByType image/jpeg "access plus 1 day" -
URL 路径无干扰参数:如
/style.css?t=123会被视为不同资源;加CacheIgnoreQueryString On可忽略查询字符串 -
不触发禁止缓存的响应头:确保后端(或 Apache 自身)未返回
Cache-Control: no-store、no-cache或private(除非是用户专属资源)
验证是否跨进程生效
缓存元数据存在共享内存中,所有子进程均可读取,验证方法要避开“单次请求命中”陷阱:
- 用
curl -I http://your-site/style.css发两次相同请求,第二响应头中出现X-Cache: HIT from example.com表示命中 - 重启 Apache 后首次请求为
MISS,但第二次起稳定HIT——说明元数据重建成功且被复用 - 检查
error_log(设LogLevel debug)是否有cache_socache: lookup key=...日志,确认元数据查询链路走通











