凌峰创科服务平台

如何清理Nginx服务器缓存?

Nginx 作为一款高性能的 Web 服务器和反向代理服务器,其缓存功能能够显著提升网站访问速度、减轻后端服务器压力,但缓存数据若不及时清理,可能导致用户无法获取最新内容,影响业务正常运行,掌握 Nginx 缓存清理的方法与技巧至关重要。

如何清理Nginx服务器缓存?-图1
(图片来源网络,侵删)

Nginx 缓存机制概述

Nginx 的缓存主要基于 proxy_cache 模块(反向代理场景)或 fastcgi_cache 模块(PHP-FPM 场景)实现,通过将后端响应的静态资源或动态页面缓存到磁盘指定目录,当用户再次请求相同资源时,直接从缓存中读取并返回,避免重复请求后端,缓存的关键参数包括:

  • proxy_cache_path:定义缓存路径、 levels(目录层级)、keys_zone(缓存共享内存区)、max_size(缓存最大容量)等;
  • proxy_cache:启用指定的缓存 zone;
  • proxy_cache_valid:设置不同状态码的缓存时间,如 200 302 10m 表示 200 和 302 状态码缓存 10 分钟。

Nginx 缓存清理的常见场景更新后需立即生效**:如网站改版、商品信息更新、文章发布后,若用户仍访问旧缓存,会导致体验不一致;

  1. 缓存数据异常或损坏:如磁盘空间不足、缓存文件不完整,可能返回错误内容;
  2. 安全策略调整:如禁止某些旧版本资源的缓存,需清理历史缓存;
  3. 服务器维护或迁移:需清理旧缓存以避免数据冲突。

Nginx 缓存清理方法

(一)手动删除缓存文件(直接操作文件系统)

Nginx 默认将缓存文件以文件形式存储在 proxy_cache_path 指定的目录中,文件名是经过 MD5 哈希后的 key(通常包含请求域名、URI、参数等)。
操作步骤

  1. 定位缓存目录:查看 Nginx 配置文件中的 proxy_cache_path 路径,如 /data/nginx/cache
  2. 查找并删除缓存文件
    • 若需清理特定 URI 的缓存,可通过 echo -n "请求的完整 URI(含域名)" | md5sum 生成哈希值,再定位对应文件(如 a1b2c3d4...)并删除;
    • 若需批量清理,可使用 find 命令,如删除所有 .tmp 临时缓存文件:find /data/nginx/cache -name "*.tmp" -delete,或按时间清理(如清理 7 天前的缓存):find /data/nginx/cache -mtime +7 -delete注意事项:直接删除文件时,需确保 Nginx 进程对该目录有读写权限,且避免在清理过程中高并发访问导致文件误删。

(二)通过 Nginx 缓存管理接口(推荐)

Nginx 本身不提供直接的缓存清理 API,但可通过 ngx_cache_purge 模块实现指定缓存的手动或批量清理。
安装 ngx_cache_purge 模块

  • 若 Nginx 已编译安装,需重新编译并添加该模块:./configure --add-module=/path/to/ngx_cache_purgemake && make install
  • 若通过包管理器安装(如 Ubuntu 的 nginx-extras),可直接安装包含该模块的扩展包。
    配置 ngx_cache_purge: 在 Nginx 配置文件中添加:
    location ~ /purge(/.*) {
      allow 127.0.0.1;       # 允许清理的 IP(可配置多个)
      deny all;
      proxy_cache_purge $host$1 $scheme$proxy_host$request_uri;
    }
  • $host$1 匹配请求的域名和 URI,如访问 http://example.com/purge/api/data 时,实际清理的是 /api/data 的缓存;
  • 需确保该 location 在启用 proxy_cacheserverlocation 块之前配置。
    发送清理请求
  • 使用 curl 命令清理指定缓存:curl http://example.com/purge/api/data
  • 可结合脚本批量清理,如通过读取数据库中的 URI 列表循环调用 purge 接口。

(三)定时任务自动清理

对于需要定期清理过期缓存的场景,可通过 crontab 设置定时任务,结合 find 命令或自定义脚本实现。
示例:每天凌晨 3 点清理 7 天前的缓存文件:

如何清理Nginx服务器缓存?-图2
(图片来源网络,侵删)
0 3 * * * find /data/nginx/cache -type f -mtime +7 -exec rm -f {} \;

优化建议

  • 在清理前可使用 du -sh /data/nginx/cache 查看缓存占用,避免误删重要数据;
  • 可通过日志记录清理操作,如 find ... -exec rm -f {} \; >> /var/log/nginx/cache_clean.log 2>&1

(四)禁用缓存临时生效

若需临时让特定请求绕过缓存(如调试阶段),可在 Nginx 配置中添加 proxy_no_cachefastcgi_no_cache 指令,或通过请求头控制(如 Cache-Control: no-cache)。
示例配置

location ~ /api/update {
    proxy_no_cache $arg_nocache;  # 当请求参数包含 nocache=1 时不缓存
    proxy_cache_bypass $arg_nocache;
    proxy_pass http://backend;
}

此时访问 http://example.com/api/update?nocache=1 将直接请求后端,不读取缓存。

缓存清理的注意事项

  1. 权限控制:手动删除缓存文件时,需使用 Nginx 运行用户(如 www-data)权限操作,避免权限不足;
  2. 并发访问:清理过程中若用户仍在访问,可能导致缓存未命中或文件锁定,建议在低峰期操作;
  3. 备份机制:重要缓存清理前可进行备份,避免误删后无法恢复;
  4. 监控与日志:通过 Nginx 的 cache 相关变量(如 $upstream_cache_status)监控缓存命中率,结合 error_log 定位清理异常。

不同场景下的清理策略对比

场景 推荐方法 优点 缺点
少量特定 URI 更新 ngx_cache_purge 模块接口 精准清理,不影响其他缓存 需额外安装模块
批量清理过期/旧缓存 定时任务 + find 命令 自动化,适合周期性清理 无法精准控制清理范围(仅按时间)
临时调试/测试环境 禁用缓存(proxy_no_cache) 无需清理,临时生效 仅对当前请求有效,非持久化
缓存文件异常/紧急清理 手动删除 + 权限校验 即时性强,可快速响应 风险较高,需谨慎操作

相关问答 FAQs

问题 1:使用 ngx_cache_purge 模块清理缓存时,提示 “404 Not Found”,可能的原因是什么?
解答:通常由以下原因导致:① 未正确安装或加载 ngx_cache_purge 模块,可通过 nginx -V 查看编译参数确认是否包含 --add-module=ngx_cache_purge;② purge 接口的 location 配置错误,未正确匹配 $host$request_uri;③ 缓存文件本身不存在(如从未被缓存),需检查模块安装、配置语法及缓存是否存在,确保 allow IP 配置正确(如需远程清理,需开放对应 IP 并配置防火墙规则)。

如何清理Nginx服务器缓存?-图3
(图片来源网络,侵删)

问题 2:清理 Nginx 缓存后,用户仍访问到旧内容,是什么原因?如何解决?
解答:可能原因包括:① 浏览器缓存:用户浏览器本地缓存了旧资源,需强制刷新(Ctrl+F5)或配置 Cache-Control 头让浏览器不缓存;② CDN 缓存:若使用了 CDN 服务,需同步清理 CDN 节点缓存(如阿里云 CDN 提供刷新接口);③ Nginx 缓存未完全清理:可能存在同名缓存文件或哈希计算错误,可通过 $upstream_cache_status 变量检查请求是否命中缓存(如 log_format 中添加 $upstream_cache_status,观察日志中的 MISS/HIT/EXPIRED 状态);④ 代理级缓存:若 Nginx 后还有其他代理层(如 Varnish),需逐级清理缓存。

分享:
扫描分享到社交APP
上一篇
下一篇