在 linux 中,nginx 实现精准缓存主动失效的核心做法是安装 ngx_cache_purge 模块,并通过配置 purge 指令来触发清理。该模块允许你通过特定的 url 路径(如 /purge/)向 nginx 发送请求,从而从磁盘或内存中删除指定的缓存文件。操作时需注意,必须确保 proxy_cache_path 中的 key 与请求的缓存键完全一致,且通常建议限制 purge 接口的访问权限以防止恶意清除。

如何配置 Nginx 以支持缓存键匹配和 Purge 接口
要实现精准的缓存失效,首先需要正确配置 Nginx 的缓存区域和代理设置,并加载第三方模块。关键在于定义唯一的缓存键(proxy_cache_key),因为 purge 机制依赖于这个键来定位具体的缓存文件。同时,需要为 purge 请求配置独立的 location 块,使用 proxy_cache_purge 指令指向相同的缓存键逻辑。

server {
listen 80;
server_name example.com;
# 定义缓存路径和区域
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
location / {
proxy_pass http://backend;
proxy_cache my_cache;
# 关键:缓存键必须与 purge 中使用的一致
proxy_cache_key $scheme$proxy_host$request_uri;
}
# 配置 Purge 接口
location /purge/ {
allow 127.0.0.1; # 仅允许本地访问,确保安全
deny all;
# 指定要清除的缓存键,逻辑需与上方 proxy_cache_key 一致
proxy_cache_purge my_cache $scheme$proxy_host$request_uri;
}
}
在上述配置中,proxy_cache_path 定义了缓存存储的位置和参数。proxy_cache_key 设置为 $scheme$proxy_host$request_uri,这意味着每个完整的 URL 对应一个唯一的缓存文件。当访问 /purge/http://example.com/some-page 时,Nginx 会计算相同的 key,找到对应的缓存文件并将其删除。返回状态码通常为 200 表示成功,404 表示缓存不存在。
Purge 模块在不同缓存后端下的行为差异
虽然 ngx_cache_purge 是最常用的方案,但 Nginx 也支持其他缓存机制,如 fastcgi_cache 或 scgi_cache。不同后端模块的 purge 实现细节略有不同,主要体现在缓存键的生成方式和存储结构上。例如,FastCGI 缓存可能涉及更多的变量组合,而 Proxy 缓存主要关注 HTTP 请求本身。

# FastCGI Cache Purge 示例配置片段
location ~ \.php$ {
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_cache my_fastcgi_cache;
fastcgi_cache_key $scheme$request_method$host$request_uri;
fastcgi_cache_purge my_fastcgi_cache $scheme$request_method$host$request_uri;
}
# SCGI Cache Purge 示例配置片段
location /scgi {
scgi_pass backend;
scgi_cache my_scgi_cache;
scgi_cache_key $host$request_uri;
scgi_cache_purge my_scgi_cache $host$request_uri;
}
对于 FastCGI 缓存,fastcgi_cache_key 通常包含 $request_method,因为 GET 和 POST 请求可能被分别缓存。因此,purge 请求也必须携带相同的方法信息(尽管 purge 本身通常是 GET,但 key 的计算逻辑需覆盖所有情况)。SCGI 缓存则相对简单,主要依赖主机和 URI。无论哪种后端,核心原则都是 _cache_purge 指令中的变量表达式必须与对应的 _cache_key 完全一致,否则无法定位到正确的缓存文件。
当 Purge 请求中的 URI 包含特殊字符或查询参数时会发生什么
当 Purge 请求中的 URI 包含特殊字符(如空格、中文)或复杂的查询参数时,Nginx 的行为取决于 proxy_cache_key 的具体定义以及 URL 编码的处理方式。如果缓存键直接使用了 $request_uri,那么 purge 请求的 URI 必须与原始请求的 URI 完全一致,包括查询参数的顺序和编码格式。任何细微的差异都会导致 purge 失败,返回 404。
例如,如果原始请求是 /page?id=1&name=test,缓存键也是 $request_uri,那么 purge 请求必须是 /purge/page?id=1&name=test。如果客户端发送的是 /purge/page?id=test&name=1(参数顺序不同),即使内容相同,由于字符串比较不匹配,purge 也会失败。此外,如果 URI 中包含未编码的特殊字符,Nginx 可能会对其进行标准化处理,导致 key 不一致。因此,建议在 proxy_cache_key 中对 URI 进行规范化处理,或者使用经过 URL 编码后的值作为 key 的一部分,以确保 purge 的准确性。











