【Nginx】怎样清除 Nginx 的缓存?
Nginx 有强大的缓存功能,主要用于反向代理缓存(proxy cache),也可以用于 FastCGI、uWSGI 等后端服务的缓存,以及静态文件的缓存控制。
Nginx 缓存的主要作用是:
- 减轻后端服务器压力:当多个请求访问同一个资源时,Nginx 可以直接从缓存中返回内容,而无需每次都请求后端服务器。
- 提高响应速度:从磁盘(或内存)读取缓存文件通常比请求后端服务器更快。
Nginx 缓存的类型
- 反向代理缓存 (Proxy Cache):这是最常用和最重要的缓存类型。Nginx 作为反向代理,将后端服务器(如 Apache, Node.js, PHP-FPM)的响应存储起来。
- FastCGI/uWSGI/SCGI/Memcached 缓存:Nginx 可以缓存这些特定后端服务的响应。
- 浏览器缓存 (Client-side Cache):Nginx 可以通过设置 HTTP 头(如
Cache-Control,Expires,Last-Modified,ETag)来指导客户端浏览器缓存资源。这虽然不是 Nginx 自身存储缓存,但它控制了客户端如何缓存。 - 静态文件缓存: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:
在你的server或location块中配置一个专门用于清除缓存的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_resultNginx 收到此请求后,会删除匹配
proxy_cache_key的缓存文件。
c) 缩短缓存有效期 / 不缓存 (Cache Invalidation)
如果你只是想确保下次请求获取到最新内容,而不是立即删除文件,可以通过调整缓存策略:
-
proxy_cache_valid:临时将缓存有效期设置得非常短(例如1s或0s),然后重新加载 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 版本以及你对服务可用性的要求。
