【Nginx】怎样清除 Nginx 的缓存?

Nginx 有强大的缓存功能,主要用于反向代理缓存(proxy cache),也可以用于 FastCGI、uWSGI 等后端服务的缓存,以及静态文件的缓存控制。

Nginx 缓存的主要作用是:

  1. 减轻后端服务器压力:当多个请求访问同一个资源时,Nginx 可以直接从缓存中返回内容,而无需每次都请求后端服务器。
  2. 提高响应速度:从磁盘(或内存)读取缓存文件通常比请求后端服务器更快。

Nginx 缓存的类型

  1. 反向代理缓存 (Proxy Cache):这是最常用和最重要的缓存类型。Nginx 作为反向代理,将后端服务器(如 Apache, Node.js, PHP-FPM)的响应存储起来。
  2. FastCGI/uWSGI/SCGI/Memcached 缓存:Nginx 可以缓存这些特定后端服务的响应。
  3. 浏览器缓存 (Client-side Cache) :Nginx 可以通过设置 HTTP 头(如 Cache-Control, Expires, Last-Modified, ETag)来指导客户端浏览器缓存资源。这虽然不是 Nginx 自身存储缓存,但它控制了客户端如何缓存。
  4. 静态文件缓存:Nginx 在服务静态文件时,也能通过上述 HTTP 头来优化其在浏览器端的缓存。

如何清除 Nginx 缓存

清除 Nginx 缓存主要有以下几种方法,取决于你清除的是哪种类型的缓存以及你的 Nginx 配置:

1. 清除 Nginx 反向代理缓存 (Proxy Cache)

Nginx 的反向代理缓存通常存储在文件系统中。

a) 手动删除缓存文件 (最直接)

这是最直接、最粗暴但有效的方法。你需要知道缓存存储的路径。

  • 查找缓存路径

    在你的 Nginx 配置文件(通常是 nginx.conf 或在 sites-available/your_site.conf 中)中查找 proxy_cache_path 指令。

    例如:

    nginx 复制代码
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;

    这里的 /var/cache/nginx 就是缓存目录。

  • 删除缓存文件

    连接到你的服务器,使用 rm -rf 命令删除缓存目录下的所有文件。
    警告rm -rf 是一个非常强大的命令,使用时请务必小心,确保路径正确,以免误删重要文件。

    bash 复制代码
    sudo rm -rf /var/cache/nginx/*
    # 或者更精确地删除子目录内容
    # sudo rm -rf /var/cache/nginx/0/*

    注意:在 Nginx 运行过程中删除缓存文件可能会导致一些文件句柄问题。更安全的方法是先停止 Nginx,删除后再启动 Nginx,但这会造成服务中断。对于生产环境,不推荐频繁使用此方法。

b) 使用 Nginx 缓存清除模块 (ngx_cache_purge)

这是最优雅和推荐的方法,允许你按需、精确地清除特定 URL 的缓存,而无需停止 Nginx 服务或手动删除文件。

  • 安装模块
    ngx_cache_purge 模块不是 Nginx 核心模块,你需要重新编译 Nginx 并加入此模块,或者使用 Nginx Plus 版本(Nginx Plus 内置了缓存清除功能)。

    如果你使用的是 CentOS/Ubuntu 的预编译 Nginx,可能需要下载 Nginx 源码,然后用 --add-module=/path/to/ngx_cache_purge 参数重新编译。

  • 配置 Nginx

    在你的 serverlocation 块中配置一个专门用于清除缓存的 location

    nginx 复制代码
    http {
        # 定义缓存区域
        proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
    
        server {
            listen 80;
            server_name example.com;
    
            # 正常代理
            location / {
                proxy_pass http://backend_server;
                proxy_cache my_cache;
                proxy_cache_key "$scheme$request_method$host$request_uri";
                proxy_cache_valid 200 302 10m; # 缓存10分钟
            }
    
            # 缓存清除接口
            location ~ /purge(/.*) {
                allow 127.0.0.1; # 只允许本地清除
                # deny all; # 阻止其他IP访问
    
                proxy_cache_purge my_cache $scheme$request_method$host$1;
                # $1 捕获 /purge/ 后面的路径,用于指定要清除的URL
            }
        }
    }
  • 清除缓存

    配置完成后,当你需要清除 http://example.com/some/path/file.html 的缓存时,你可以向 http://example.com/purge/some/path/file.html 发送请求(例如,使用 curl 命令)。

    bash 复制代码
    curl -X GET http://example.com/purge/some/path/file.html
    # 或者对于需要POST请求的资源
    # curl -X GET http://example.com/purge/some/path/post_result

    Nginx 收到此请求后,会删除匹配 proxy_cache_key 的缓存文件。

c) 缩短缓存有效期 / 不缓存 (Cache Invalidation)

如果你只是想确保下次请求获取到最新内容,而不是立即删除文件,可以通过调整缓存策略:

  • proxy_cache_valid :临时将缓存有效期设置得非常短(例如 1s0s),然后重新加载 Nginx 配置。

    nginx 复制代码
    proxy_cache_valid 200 302 1s; # 缓存1秒

    这样,缓存很快就会失效,Nginx 会重新请求后端。

  • proxy_no_cache / proxy_cache_bypass :通过设置特定条件来跳过缓存。

    例如,当你检测到特定的请求头时,不使用缓存:

    nginx 复制代码
    map $http_x_no_cache $no_cache {
        default 0;
        "true" 1;
    }
    proxy_no_cache $no_cache; # 如果 X-No-Cache 头为 true,则不缓存
    proxy_cache_bypass $no_cache; # 如果 X-No-Cache 头为 true,则绕过缓存

    然后发送 curl -H "X-No-Cache: true" http://example.com/your_page.html 即可获取最新内容。

2. 清除浏览器缓存 (客户端缓存)

Nginx 无法直接清除用户浏览器中的缓存。这是客户端的行为。但你可以通过以下策略让浏览器知道缓存已过期或内容已更新:

  • 版本化 URL (Cache Busting)
    这是最可靠的方法。当你的静态文件(CSS, JS, 图片)更新时,改变其 URL。
    例如,将 /css/style.css 变成 /css/style.css?v=1.2.3/css/style.12345.css
    这样,即使浏览器缓存了旧的 /css/style.css,也会请求新的 URL。

  • 设置短的或不缓存的 Cache-Control
    对于你希望总是获取最新内容的资源(例如 HTML 页面),在 Nginx 中设置:

    nginx 复制代码
    add_header Cache-Control "no-cache, no-store, must-revalidate";
    add_header Pragma "no-cache";
    expires 0;

    这样浏览器就不会缓存这些资源,或者每次都会向服务器验证。

  • 用户手动清除
    告诉用户按 Ctrl + F5 (Windows/Linux) 或 Cmd + Shift + R (Mac) 进行强制刷新,或者在浏览器设置中清除缓存。

3. 重启 Nginx (不推荐作为主要清除缓存方法)

重启 Nginx 本身并不会清除磁盘上的缓存文件,但它会刷新 Nginx 内部对这些文件的状态,对于某些配置更改或内部问题可能有用。它不会像 rm -rf 那样删除缓存数据。

bash 复制代码
sudo systemctl restart nginx
# 或者
sudo service nginx restart

总结与建议

  • 对于生产环境的反向代理缓存清除 :强烈推荐使用 ngx_cache_purge 模块。它提供了细粒度的控制,避免了服务中断,且更安全。
  • 对于开发或测试环境的代理缓存 :手动删除缓存目录下的文件 (rm -rf) 简单粗暴,但要注意路径和权限。
  • 对于浏览器缓存 :采用版本化 URL 是最佳实践,能有效避免用户看到旧内容。同时,为不希望缓存的页面设置合适的 Cache-Control 头。

选择哪种方法取决于你的具体需求、Nginx 版本以及你对服务可用性的要求。

相关推荐
vvw&2 小时前
如何在 Ubuntu 24.04 上安装和使用 AdGuard
linux·运维·服务器·ubuntu·adguard
weixin_453253652 小时前
python+playwright自动化如何解决文件上传问题
运维·自动化
King's King2 小时前
超详细的自动化立体仓库技术标书-模板
运维·自动化
TTBIGDATA2 小时前
【Ambari开启Kerberos】Step1-KDC服务初始化安装-适合Ubuntu
运维·数据仓库·hadoop·ubuntu·ambari·hdp·bigtop
诗9趁年华3 小时前
缓存三大问题深度解析:穿透、击穿与雪崩
java·spring·缓存
whltaoin3 小时前
【JAVA全栈项目】弧图图-智能图床SpringBoot+MySQL API接口结合Redis+Caffeine多级缓存实践解析
java·redis·spring·缓存·caffeine·多级缓存
Fr2ed0m4 小时前
Nginx防御HTTP Host头注入漏洞:实战配置漏洞修复教程
运维·nginx·http
安审若无4 小时前
linux怎么检查磁盘是否有坏道
linux·运维·服务器
HalvmånEver4 小时前
Linux的第二章 : 基础的指令(二)
linux·运维·服务器·开发语言·学习