我从两天前就开始做这件事,但没有成功。
所以,基本上,我想绕过特定传入请求 URL 的 varnish 缓存。
我定义了这个规则:
sub vcl_recv {
if (req.url ~ "/en/reading-books/") { return(pass); }
}
但是当我刷新页面时,它仍然被缓存,响应标头返回这些:
via: 1.1 varnish-v4
x-varnish: 2
此后台运行命令产生输出:
varnishncsa -F '%{Host}i %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i"'
我这里遗漏了什么?任何指点都非常感谢。
答案1
升级到受支持的版本
在讨论调试传入 URL 的缓存之前,我想指出的是你正在运行已停产的 Varnish 版本,该版本存在已知的安全漏洞。
请升级到最新版本或使用 Varnish Cache 6.0 LTS。
看https://www.varnish-software.com/developers/tutorials/#installations获得各种 Linux 发行版的安装指南列表。
匹配精确 URL 或 URL 模式
您共享的 VCL 代码绕过了 的缓存/en/reading-books
。您是否尝试对该 URL 进行精确匹配,或者尝试匹配一组 URL 的模式?
为了实现完全匹配,我会按如下方式调整 URL:
sub vcl_recv {
if (req.url == "/en/reading-books/") {
return(pass);
}
}
当您匹配多个以 开头的 URL 时/en/reading-books/
,我会按如下方式调整 VCL:
sub vcl_recv {
if (req.url == "^/en/reading-books/.*$") {
return(pass);
}
}
那么 Varnish 特定的响应标头呢
您在问题中提到了以下标题:
via: 1.1 varnish-v4
x-varnish: 2
这些表明您正在使用 Varnish,但不一定表示 Varnish 从缓存中提供响应。
标via
头只是告知用户 Varnish 是响应链中的代理服务器这一事实。
标头的值x-varnish
通常指的是处理您的请求的交易的 ID。
它实际上是Age
指示从缓存中提供响应的时间长度的标题。
检查日志
该varnishncsa
命令可以访问 Varnish 共享内存日志,但实际上并没有显示很多有用的缓存信息。
目的varnishncsa
是返回访问日志信息,类似于Apache和Nginx返回的信息。
请运行以下命令来调试缓存:
varnishlog -g request -q "ReqUrl ~ '^/en/reading-books/.*$'"
虽然varnishncsa
会产生 NCSA 格式的单行响应,但varnishlog
会返回完整的交易。请将输出添加到varnishlog
您的问题中,我会帮助您进行调试。