根本原因是各节点独立缓存且无共享层,解决方向是共用静态资源(如NFS挂载)或文件名绑定哈希实现自动失效;需禁用mod_cache_disk、统一权限与CDN回源策略。

Apache 集群中静态文件缓存不一致,本质不是 Apache 缓存“没同步”,而是各节点各自缓存、各自服务、各自更新——没有共享缓存层,也没有统一资源视图。解决方向很明确:**不让各节点独立缓存,改为共用同一份静态资源;或让缓存行为天然与文件名绑定,使旧缓存自动失效**。
用 NFS 共享静态资源目录
这是最直接、最可控的方案,所有节点读取同一物理路径,内容天然一致:
- 在专用存储服务器上导出静态资源目录(如
/data/web/static),配置/etc/exports并开放端口 111 和 2049 - 每个 Apache 节点通过
_netdev,soft,intr,rsize=8192,wsize=8192参数挂载到本地(如/mnt/nfs/static),_netdev是关键,避免开机网络未就绪导致挂载失败 - Apache 配置中用
Alias /static /mnt/nfs/static指向该挂载点,确保所有请求都落到同一位置 - 注意权限:Apache 进程用户(如
www-data)需对挂载目录有读权限;若涉及上传,需统一 UID/GID 或配置anonuid/anongid
用构建哈希 + 强缓存头替代运行时更新
不依赖 Apache 清缓存或同步动作,而是让每次发布都生成新文件名,旧缓存自然过期、新请求命中新资源:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 前端构建工具(Webpack/Vite)输出带内容哈希的文件,如
main.a8b3c9.js、style.f2d1e4.css - HTML 中直接引用完整哈希路径,不使用重写规则映射通用名(如避免把
/js/app.js重写成哈希名) - Apache 对这些路径统一设置响应头:
Cache-Control: public, immutable, max-age=31536000;immutable可防止浏览器按 F5 发送条件请求,彻底规避协商缓存干扰 - 部署时保留旧哈希文件至少 7 天,配合长缓存,让 404 请求自然淘汰,不中断用户体验
禁用 Apache 本地磁盘缓存(mod_cache_disk)
如果集群节点都走 NFS,就不要再让每个节点再缓存一遍——既浪费磁盘,又引入多层缓存判断逻辑,增加不一致风险:
- 移除或注释掉
CacheEnable disk /static/等配置 - 关闭
mod_cache、mod_cache_disk模块(除非你确需缓存后端动态接口) - 仅保留
mod_expires和mod_headers,用于设置浏览器和 CDN 的缓存策略 - 确认
Options -MultiViews已禁用,防止 Apache 尝试匹配app.js.gz失败后返回错误内容
补充建议:CDN 层统一回源到 NFS 或对象存储
把缓存压力从 Apache 集群卸载到 CDN,同时保证源站一致性:
- CDN 回源地址设为统一入口(如负载均衡 VIP 或对象存储桶),而非某台 Apache 节点 IP
- 若仍用 Apache 做源站,确保所有节点回源到同一 NFS 路径,而非本地
DocumentRoot - CDN 缓存策略严格依据
Cache-Control: public, max-age=...,避免自作主张缓存私有响应

















