缓存机制本身不会撑爆磁盘,问题在于将含用户Token、时间戳等动态内容误作静态资源缓存,导致大量变体文件堆积耗尽inode或磁盘空间。
缓存机制本身不会撑爆磁盘,问题出在“把不该缓存的动态内容塞进了静态资源路径”——比如前端构建时把含用户 Token、时间戳、随机 UUID 的 JS/CSS 文件名或内联脚本,当成普通静态资源交给 Service Worker 或 CDN 缓存。这类文件体积不大,但每请求一次就生成一个新变体,几天内就能在 Cache Storage 或服务器磁盘上堆积数万个小文件,迅速耗尽 inode 或占满空间。
先别急着删,得确认是哪一层在偷偷注入动态值:
v1.2.3-abc123、app-20260617-152348.js这类带时间/哈希/随机段的命名——说明构建脚本或插件(如 Webpack 的contenthash误配、Vite 的rollupOptions.output.entryFileNames含[timestamp])在制造唯一文件Cache-Control: public, max-age=31536000但ETag或Last-Modified频繁变动,说明内容实际在变,却用了强缓存策略?token=xxx、&t=1718612345等查询参数——带参 URL 被 SW 全部独立缓存,一个页面加载 20 个带不同 token 的 JS,就存 20 份关键不是禁用缓存,而是让缓存对象真正“静态”:
output.filename只用[name].[contenthash:8].js;Vite 中检查build.rollupOptions.output.entryFileNames和chunkFileNames,移除[timestamp][random]等非确定性占位符<script>window.__TOKEN__ = 'xxx'</script>方式内联到 HTML 模板里,或通过 API 动态获取。JS 文件本身保持纯逻辑、无敏感上下文import())中避免拼接 token 到路径,改用请求头(Authorization)或 body 提交;CDN 配置需开启“忽略指定查询参数缓存”,例如 Cloudflare 的 Cache Key 设置中排除tokentsid等参数已有数万份带 token 的 JS/CSS 占满 Cache Storage 或服务器磁盘,需分层清除:
Ctrl+Shift+R强制重载,绕过残留 SWfind /var/www/static -name "*token*" -o -name "*t=*" -o -name "*sid=*" -delete 2>/dev/null(先测试不加-delete);重点清理js/css/目录下含动态片段的文件防止下次复发,要卡住构建、部署、运行三个环节:
grep -r "new Date|Math.random|Date.now|__TOKEN__" src/扫描源码,禁止构建含实时值的 JS;用ls dist/*.js | wc -l对比历史版本,突增即告警curl -I https://yoursite.com/app.js | grep -i "cache-control",确保强缓存资源返回的ETag稳定(两次请求值一致)df -i /var/www定时任务,当 Use% > 90% 时自动发告警,并触发find /var/www/static -type f -name "*.js" -mmin +1440 | xargs rm -f清理超 24 小时未修改的 JS 文件(仅作兜底)