我一直在研究一些用于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。