如何清空 Nginx 的缓存?
清 Nginx 缓存按类型处理:proxy/FastCGI 缓存先核实 cache_path 与并发写入;删除文件本身无需 reload,精细失效用匹配版本的 PURGE,bypass 仅绕过读取;opcache/浏览器缓存另说。本文分类给出操作。
先分清缓存类型:Nginx 自己的缓存(proxy_cache / fastcgi_cache)清法是先确认 proxy_cache_path/fastcgi_cache_path 实际目录,再按运维流程失效文件或缓存区;删除文件本身不要求 reload**;想只失效某个 URL 可用对应版本的 PURGE 功能;proxy_cache_bypass 仅绕过读取,不等于删除条目。另外两类容易混淆的"缓存"——PHP OPcache 和浏览器缓存——清法完全不同。**
一、清 proxy_cache / fastcgi_cache
# 1. 找缓存目录
grep -r "cache_path" /etc/nginx/
# proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m ...
# 2. 删除缓存文件
# 确认该目录仅包含目标缓存,并协调写入者后再执行删除
# 删除操作会造成冷缓存和回源压力,避免直接复制未知路径的 rm -rf
# 3. 仅修改配置时才需要验证并 reload
sudo nginx -t && sudo systemctl reload nginx
缓存可能按请求重新生成;并发写入、打开的文件、目录权限和冷缓存回源负载都需考虑,并非无副作用。
二、精细化失效(不清整个目录)
临时绕过缓存回源(验证后端最新内容):
curl -H "Cache-Control: no-cache" http://site/page # 需配置 proxy_cache_bypass
配置:
proxy_cache_bypass $http_cache_control; # 任意非空且不为 "0" 的该变量均触发,并非仅识别 no-cache
proxy_no_cache $http_cache_control; # 同时阻止该响应写入缓存
单 URL 主动失效:Nginx Plus 提供官方 cache purge;开源版可评估第三方模块,但两者指令参数不同,不能混用。按实际模块文档配置,并限制清理接口权限,确保清理键与原缓存键完全一致。
清理或调整策略后,检查日志中记录的 $upstream_cache_status,比较相同路径的 HIT/MISS 分布与上游耗时。应同时观察回源负载,避免只确认内容更新而漏掉数据库或应用压力变化。
三、别搞混的两种"缓存"
| 你以为要清的 | 实际在哪 | 清法 |
|---|---|---|
| PHP 页面还是旧的 | PHP OPcache | 按所用 FPM 服务流程重载/重启;opcache_reset() 必须在相应 Web/FPM SAPI 中调用,CLI 缓存不等于 FPM 缓存 |
| 用户看到旧内容 | 浏览器/CDN 缓存 | 资源文件名加版本哈希、调 Cache-Control、CDN 控制台刷新 |
Nginx 没配 proxy_cache 时,它本身没有页面缓存可清——问题多半在上面两行。
常见问题(FAQ)
Q:删缓存文件时 Nginx 还在写会冲突吗?
A:可能发生竞态,正在打开的文件也可能继续提供旧内容;应协调缓存写入/切换流程,不能认为 reload 或目录改名自动消除所有影响。
Q:缓存目录暴涨怎么控制?
A:proxy_cache_path 里设 max_size 与 inactive(多久不访问就淘汰),cache manager 会异步清理,max_size 是软上限,短时可能超出。
Q:为什么清了缓存页面还是旧的?
A:大概率是浏览器或 CDN 缓存——强刷(Ctrl+F5)或 curl 直接测源站验证。