【Nginx】怎样清除 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 指令。
    例如:

    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 是一个非常强大的命令,使用时请务必小心,确保路径正确,以免误删重要文件。

    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

    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 命令)。

    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 配置。

    proxy_cache_valid 200 302 1s; # 缓存1秒
    

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

  • proxy_no_cache / proxy_cache_bypass:通过设置特定条件来跳过缓存。
    例如,当你检测到特定的请求头时,不使用缓存:

    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 中设置:
    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 那样删除缓存数据。

sudo systemctl restart nginx
# 或者
sudo service nginx restart

总结与建议

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值