有人可以在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); } ... } 

基本上,我不明白pipe道到后端未知请求会有什么意义? 这是为了万一一些奇怪的Web应用程序/协议,所以它会工作?

为什么pipe这个请求比“传递”它更好呢?

如果有人可以解释这件作品的用例,我很乐意。

pass指令使Varnish像一个典型的7层反向代理一样,通过逐个读取和重放每个请求来转发stream量。

pipe指令使Varnish像HTTP CONNECT代理一样 ,将数据stream逐字节地传送到后端服务器。

如果请求方法未知,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调用vcl_pipe ,并确保后端服务器接收HTTP Upgrade头指令,并在继续之前切换到WebSocket。