我一直在研究 Varnish 3.x 的一些 VCL 文件示例,并且我已经多次偶然发现这个文件,它让我摸不着头脑:
sub vcl_recv {
...
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
return (pipe);
}
...
}
基本上,我不明白将未知请求传输到后端有什么意义?这只是为了防止某些奇怪的 Web 应用程序/协议出现问题,这样它才能正常工作吗?
为什么通过管道传输这个请求比‘传递’它们更好?
如果有人能解释一下这件作品的用例我会很高兴。
答案1
该pass
指令使 Varnish 就像一个经典的第 7 层反向代理,通过逐个读取和重放每个请求来转发流量。
指令pipe
使 Varnish 充当 HTTP CONNECT 代理,逐字节地向后端服务器传输流量。
如果请求方法未知,Varnish 可能不知道如何解释和处理每个请求,在这种情况下您可能根本不想触碰它,因此您看到了 VCL 示例。
WebSocket 就是一个很好的例子(来自文档):
sub vcl_pipe {
if (req.http.upgrade) {
set bereq.http.upgrade = req.http.upgrade;
}
}
sub vcl_recv {
if (req.http.Upgrade ~ "(?i)websocket") {
return (pipe);
}
}
vcl_pipe
在传输开始时被调用,确保后端服务器收到HTTPUpgrade
头指令并切换到WebSocket后再继续。