是否可以使用 NGINX 清除特定 URL 的缓存?

是否可以使用 NGINX 清除特定 URL 的缓存?

0

我正在使用 NGINX 作为反向服务器,但是在对我的网站页面进行更改时遇到问题,直到我清除整个 NGINX 缓存后才能看到更改,这导致它清除了我的整个网站,而不仅仅是我正在工作的 URL。

所以我想知道是否可以只清除特定 URL 的缓存。

我已经配置了动态内容部分,但页面加载超过了 600 毫秒,而当它只有静态内容时,它会在 200 毫秒内加载。

我在终端中使用了这个命令行,但它也不起作用

grep -lr 'https://example.com/blog/name-of-blog.php$' /var/cache/nginx/*

另外,我已经尝试从 .htaccess 文件进行配置,但结果并不如我预期。

我希望你可以帮助我。

答案1

在当前的 nginx 版本中,缓存文件有一行以 开头KEY:,其中包含存储在缓存文件中的对象的键。

key 的默认值记录在nginx 文档,而且是

$scheme$proxy_host$request_uri

nginx 变量文档我们可以看到这$request_uri是带有参数的完整请求 URI。

如果您的请求正是https://example.com/blog/name-of-blog.php,那么上述命令应该可以找到正确的文件。

但是,如果 URL 包含查询参数,则需要将其包含在搜索字符串中,或​​者您需要删除$以进行前缀匹配。

还要注意,nginx 在删除后仍会尝试访问文件的缓存版本,并且当无法打开缓存文件时,它会发出日志消息。

reload因此从缓存中删除文件后对 nginx 进程很有用。

答案2

是的,你做错了——使用了过于复杂的模式。缓存键条目将存储为取决于proxy_cache_key变量的值,但简单的方法不是尝试手动计算,而是只查看进入缓存树中的实际缓存文件,纠正您的搜索模式并进行正确的搜索。

看着你的grep钥匙——我会说

  • 你使用了正则表达式,但缺少-e
  • 此外,你可能根本不需要正则表达式

我将首先搜索虚拟主机名称,然后根据需要将搜索范围缩小到实际 URI。

然后像

grep -R <the pattern you figured out> /var/cache/nginx | awk '{print $1}' | xargs -I % rm %

相关内容