Apache不会自动识别高频资源,必须由后端显式设置Cache-Control: public, max-age=N且无Set-Cookie/Vary:*,并启用mod_cache_disk、CacheLock、CacheIgnoreQueryString等模块精准配置,否则静默跳过缓存。

Apache 本身不会自动识别“高频资源”,必须通过明确的缓存策略+响应头配合+模块协同,才能让高频请求真正命中缓存。关键不在“识别”,而在“定义可缓存性”和“规避默认拦截”。
后端必须主动声明缓存意愿
Apache 的 mod_cache 默认对绝大多数 API 或动态响应静默跳过——它不猜测,只检查硬性条件:
-
Cache-Control 头必须含 public 且带 max-age 或 s-maxage:例如
Cache-Control: public, max-age=300;仅max-age=300或no-cache都无效 -
不能含 Set-Cookie 或 Vary: *:前者表示私有状态,后者让缓存键失效;若需按 User-Agent 区分,应明确写
Vary: User-Agent,而非通配 -
状态码需在默认白名单内:200、301、302 可缓存;404、500、401 默认不缓存(除非启用
CacheStorePrivate On,但不推荐用于 API)
用 curl -I https://your-api.com/endpoint 查看真实响应头。如果返回 Cache-Control: no-cache 或压根没这个头,说明后端没配合,Apache 根本不会尝试缓存。
Apache 需启用并精准配置缓存模块
仅加载 mod_cache 不够,必须搭配存储后端(如磁盘)并绕过默认拦截逻辑:
- 启用主缓存模块:
LoadModule cache_module modules/mod_cache.so和LoadModule cache_disk_module modules/mod_cache_disk.so - 开启磁盘缓存:
CacheEnable disk /(路径需匹配你的资源路由) - 关闭快速处理器:
CacheQuickHandler off(必须放在 Server 或 VirtualHost 级别,否则所有请求被截断,缓存逻辑不执行) - 允许忽略干扰头:
CacheIgnoreHeaders Set-Cookie Authorization(防止带认证或会话信息的请求污染共享缓存)
注意:mod_cache_socache 单独启用无意义——它只缓存元数据(ETag、过期时间),不存响应体;没有 mod_cache_disk 做主缓存,高并发下仍要反复读磁盘。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
高频场景必须加锁防击穿
当大量请求同时打向未缓存的热点资源(如首页、热门商品),Apache 默认会全部转发到后端,造成缓存击穿。需启用 CacheLock:
- 加载依赖模块:
LoadModule socache_dbm_module modules/mod_socache_dbm.so - 开启锁机制:
CacheLock on,并指定可写路径:CacheLockPath /var/cache/apache2/cache-lock - 设置合理超时:
CacheLockMaxAge 5(单位秒),太长阻塞后续请求,太短失去锁意义 - 确保缓存 key 一致:
CacheIgnoreQueryString on(过滤时间戳、随机参数等导致 key 分散的因素)
验证是否生效:用 ab -n 100 -c 50 压测接口,观察后端 access log——开启锁后,应仅出现 1–3 次记录,而非接近 50 次。
静态资源建议走浏览器缓存+服务端压缩
对 CSS、JS、图片等静态资源,优先利用客户端缓存降低回源压力:
- 启用
mod_expires和mod_headers,设置强缓存策略:ExpiresByType text/css "access plus 1 month" - 启用
mod_deflate压缩文本类资源,减少传输体积(60–80%) - 避免为小文件启用
mod_file_cache(已过时),改用内存友好的 Caffeine 在应用层缓存内容,Apache 仅作反向代理响应
不复杂但容易忽略:缓存效果唯一可信信号是响应头中的 X-Cache: HIT,不是配置写了就生效,也不是日志报错才失败——它静默失败是常态。

















