
排查 Nginx 缓存清理不及时导致用户看到旧版前端页面,关键不是“有没有删”,而是“该不该缓存、缓存了没、删对地方没”。重点查三层:浏览器是否绕过了请求、Nginx 是否真缓存了、清理动作是否命中目标缓存项。
一、确认浏览器是否压根没发请求
用户看到旧页面,可能根本没向 Nginx 发起新请求——强缓存拦在最外层。
- 打开浏览器 DevTools → Network 标签页,刷新页面,查看 index.html 的响应头:必须有
Cache-Control: no-cache或no-store;若出现max-age=31536000或immutable,说明 HTML 被强缓存,后续所有 JS/CSS 引用都基于旧入口,必然出错 - 检查一个带 hash 的 JS 文件(如
main.a1b2c3.js):应有Cache-Control: public, immutable和Expires为一年后;若它也显示from memory cache或304,说明构建后未更新 HTML 中的引用路径,或 CDN 未刷新 - 尝试无痕窗口访问,或在地址栏加随机参数(
?v=123),看能否加载新版——能则锁定是客户端缓存问题
二、验证 Nginx 是否真实缓存并命中
别信配置,要看日志和响应头证据。
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
- 在 Nginx
log_format中加入$upstream_cache_status,例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_cache_status";'
然后查 access.log:出现HIT表示命中缓存,MIS表示未命中(可能没缓存),EXPIRED表示过期但尚未被清除,BYPASS表示被proxy_cache_bypass绕过 - 用
curl -I https://yoursite.com/查响应头:
若有X-Proxy-Cache: HIT,说明 Nginx 层缓存生效;
若为MISS或无此头,说明该请求根本没进 proxy_cache(可能是静态文件直读、fastcgi_cache 生效、或 location 规则未匹配) - 检查站点配置中是否混用
proxy_cache和fastcgi_cache:前者用于反向代理后端,后者专用于 PHP 动态内容;宝塔「全清缓存」按钮只清proxy_cache默认路径,对fastcgi_cache完全无效
三、核对清理动作是否真正生效
手动 purge 或脚本清理,常因路径、模块、权限三处失效而“看似执行实则落空”。
立即学习“前端免费学习笔记(深入)”;
- 确认
ngx_cache_purge模块已启用:nginx -V 2>&1 | grep -o ngx_cache_purge,无输出需重编译或换支持版本(宝塔 OpenResty 默认含但需显式启用) - 检查 purge location 配置是否严格匹配:
例如缓存 key 是$scheme$proxy_host$request_uri,那么 purge 请求/purge/必须对应根路径缓存;若缓存的是https://a.com/style.css,就得调用/purge/style.css,不能少斜杠或多参数 - 验证缓存目录权限:
ls -ld /var/cache/nginx/my_cache(或你自定义路径),属主应为运行 Nginx 的用户(如www:www);若权限不足,Nginx 写缓存失败,自然也删不掉——此时rm -rf清目录后仍会复现旧内容
四、排除其他干扰层
缓存链路上不止 Nginx 一层,常见“背锅侠”:
-
CDN:即使 Nginx 缓存已清,CDN 节点仍可能返回旧内容。登录 CDN 控制台,手动提交
/或/*.js刷新任务,注意全球同步延迟(通常 1–5 分钟) -
PHP OPcache:WordPress 等动态站若启用了 OPcache,修改 PHP 文件后需调用
opcache_reset()或重启 PHP-FPM,否则fastcgi_cache可能始终返回旧编译结果 -
构建产物未更新:检查部署后的
index.html中引用的 JS/CSS 文件名是否确为新 hash;若构建未触发或上传遗漏,Nginx 即使缓存刷新也没用

















