Apache中“分布式二级缓存”本质是mod_proxy调度+两层mod_cache_disk协同:边缘层缓存地域性资源,中心层缓存长尾并共享热点,依赖Cache-Control头、统一缓存键及CacheIgnoreHeaders Set-Cookie等配置保障一致性。

在 Apache 中用 mod_proxy 实现静态资源的“分布式二级缓存”,本质上不是靠 mod_proxy 本身做缓存(它不缓存),而是把它和 mod_cache、mod_cache_disk(或 mod_cache_socache)协同使用,再通过反向代理拓扑构造两级缓存结构:第一级是边缘节点(如各地 CDN 边缘或区域 Apache 服务器),第二级是中心缓存网关(如统一缓存集群前置的 Apache 实例)。关键在于合理分层、缓存键控制、缓存失效协同和后端响应头配合。
明确角色分工:mod_proxy 不缓存,只做调度
mod_proxy(尤其是 proxy_http)负责将请求转发给后端服务,但它本身不存储内容。真正实现缓存的是 mod_cache 模块及其后端驱动(如 mod_cache_disk)。因此,“二级缓存”需由两层独立启用 mod_cache 的 Apache 实例构成,mod_proxy 仅承担路由与协议适配职责:
- 边缘层 Apache:启用
mod_cache_disk+mod_proxy,代理到中心缓存层;本地磁盘缓存高频、地域性静态资源(如图片、JS/CSS) - 中心层 Apache:同样启用
mod_cache_disk(或搭配mod_cache_socache做共享元数据),代理到真实源站(如 NFS、对象存储网关或应用服务器);承担长尾资源缓存和跨边缘共享热点 - 两层之间通过标准 HTTP 协议通信,依赖
Cache-Control、ETag、Last-Modified等头字段协调缓存行为
配置两级缓存的关键模块与指令
确保以下模块已启用(在 httpd.conf 或 mods-enabled/ 中):
-
mod_proxy、mod_proxy_http -
mod_cache、mod_cache_disk(或mod_cache_socache+mod_socache_shmcb) -
mod_expires(可选,用于补全过期策略) -
mod_headers(必需,用于透传/重写缓存相关头)
中心层示例片段(代理到源站并缓存):
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
CacheRoot /var/cache/apache2/central CacheEnable disk / CacheIgnoreNoLastMod On CacheIgnoreHeaders Set-Cookie CacheIgnoreCacheControl Off CacheLock on CacheLockPath /var/cache/apache2/cache-lock CacheQuickHandler off <p>ProxyPass / <a href="https://www.php.cn/link/67a830716aad8b9637849d11259244ed">https://www.php.cn/link/67a830716aad8b9637849d11259244ed</a> ProxyPassReverse / <a href="https://www.php.cn/link/67a830716aad8b9637849d11259244ed">https://www.php.cn/link/67a830716aad8b9637849d11259244ed</a>
边缘层示例(代理到中心层,并启用本地缓存):
CacheRoot /var/cache/apache2/edge CacheEnable disk / CacheIgnoreNoLastMod Off # 强制继承上游 Cache-Control,避免被边缘覆盖 CacheIgnoreCacheControl On CacheStorePrivate Off CacheStoreNoStore Off <p>ProxyPass / <a href="https://www.php.cn/link/2329c2ed32352097d6b22e06b9e954ee">https://www.php.cn/link/2329c2ed32352097d6b22e06b9e954ee</a> ProxyPassReverse / <a href="https://www.php.cn/link/2329c2ed32352097d6b22e06b9e954ee">https://www.php.cn/link/2329c2ed32352097d6b22e06b9e954ee</a>
保证缓存一致性与穿透控制
两级缓存易出现 stale 数据或重复回源。需从响应头、缓存键、失效机制三方面约束:
-
统一缓存键:禁用影响缓存键的变量,如默认关闭
Vary: User-Agent;若需区分终端,显式设置Vary: Accept-Encoding并确保压缩一致性 -
信任上游缓存头:边缘层设
CacheIgnoreCacheControl On,但中心层必须严格生成可信Cache-Control: public, max-age=3600;源站应避免返回no-store给静态资源 -
主动失效支持:Apache 原生不支持 PURGE,可通过
mod_proxy转发 PURGE 请求到中心层,再由中心层用mod_cache的cache_purge指令(需开启CacheIgnoreNoLastMod和自定义 handler)或外部脚本清理磁盘缓存文件 -
避免缓存 Set-Cookie:静态资源不应带 Cookie,务必用
CacheIgnoreHeaders Set-Cookie防止污染缓存
验证与调优建议
上线前需确认缓存是否生效及层级是否正确:
- 检查响应头:
X-Cache: HIT from central或X-Cache: MISS from edge(需自行添加Header set X-Cache "HIT from edge" env=cache_hit类似逻辑) - 监控
CacheRoot目录增长、inode 使用、磁盘 I/O;对高并发场景,建议 SSD 存储 + 合理CacheDirLevels(如2 3)降低目录深度 - 用
ab或wrk对比直连源站 vs 经两级代理的 TTFB 与吞吐,观察缓存命中率提升 - 注意时间同步:所有节点 NTP 对齐,否则
Expires和max-age计算可能偏差

















