有人可以解释一下 Varnish 3.x 上的这段 VCL sub_recv 吗?

有人可以解释一下 Varnish 3.x 上的这段 VCL sub_recv 吗?

我一直在研究 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后再继续。

相关内容