我正在使用varnish configuration I didn't write,此配置似乎可互换地使用(pass)
和(pipe)
。我有点不清楚这两种行为之间的区别究竟是什么。
(pipe)
上的手册部分对我来说有点神秘
也可以从vcl_recv返回管道。管道短路客户端和后端连接,Varnish将坐在那里来回移动字节。 Varnish不会查看来回发送的数据 - 因此您的日志将不完整。请注意,使用HTTP 1.1,客户端可以在同一连接上发送多个请求,因此您应该指示Varnish添加" Connection:close"实际返回管道之前的标题。
我不确定当他们说"短路"或者在这种情况下短路是什么意思时,他们正在谈论什么客户,或者来回清洗字节的方式是什么?与其正常行为不同。也就是说,这个描述对于理解清漆实现的人来说可能很有用,但对于理解清漆角色的人(我)来说这有点令人困惑,因为拉出这个HTTP请求的结果从内存中,或从应用程序中提取此HTTP请求的结果"。
那么,鉴于上下文,(pipe)
与(pass)
的不同之处究竟是什么?
(我正在使用的特定后端应用程序是Magento,一个基于PHP的电子商务应用程序,如果重要(mod_php
,FastCGI等)
答案 0 :(得分:8)
我不是任何一个光油专家,但这是我的经验和我对管道与传递的理解。
使用pass varnish作为常规 HTTP代理;它读取请求并将其推送到后端(Apache / Nginx)
另一方面,管道将清漆变为 TCP代理,在Magento的上下文中,当后端以CSV,pdf或CSV格式返回文件时,这很方便可下载的文件。例如:
if ( req.url ~ ".*/orderprint/.*")
{
set req.http.connection = "close";
return(pipe);
}
如果没有我们在提供文件或客户试图下载其可下载产品时经常会看到超时。
答案 1 :(得分:3)
Allan基本上总结得很好,为了更详细一点,我们可以看看Varnish并比较pass()和pipe():
<强>管:强>
https://github.com/varnish/Varnish-Cache/blob/master/bin/varnishd/cache/cache_req_fsm.c#L552
在cnt_pipe(...)中,varnish处理返回(管道);命令。
bo = VBO_GetBusyObj(wrk, req);
从当前bo
请求对象生成新的req
(后端请求对象)。
http_PrintfHeader(bo->bereq, "X-Varnish: %u", VXID(req->vsl->wid));
http_SetHeader(bo->bereq, "Connection: close");
VCL_pipe_method(req->vcl, wrk, req, bo, NULL);
此时Varnish在后端请求中设置X-Varnish
和Connection: close
标头,并调用VCL_pipe_method(取自VCL文件),因此,如果需要,可以操作之后的后端请求。不需要在您的VCL中明确设置Connection: close
。
经过一些检查后,Varnish调用VDI_Http1Pipe(req, bo)
(在if语句中)。
VDI_Http1Pipe
调用http1pipe
,调用V1F_SendReq
发送请求并处理所有HTTP内容。 V1P_Process
将数据发送回实际的客户端(通常是访问该页面的浏览器)。
返回cnt_pipe
函数return return (REQ_FSM_DONE);
,完成内部状态机并完成请求处理。
总结:除了明确关闭连接并在后端请求上设置X-Varnish标头之外,Varnish不会做任何其他事情。
<强> PASS:强>
https://github.com/varnish/Varnish-Cache/blob/master/bin/varnishd/cache/cache_req_fsm.c#L518
现在让我们看看cnt_pass
,它是从VCL处理return (pass);
的函数:
而不是直接调用VDI_Http1Pipe
方法Varnish调用VBF_Fetch
,它使用Pool_Task
对任务进行排队(任务是获取后端响应并将其传递给客户端)。
完成该任务后cnt_pipe
清理内存并返回return (REQ_FSM_DONE);
以确保无需执行其他工作,包括在VCL文件中调用deliver
等等
<强>结论:强>
pipe
实际上并不像Allan所说的那样充当TCP-Pipe,但非常相似。调用pipe
基本上告诉Varnish发送请求,传递结果然后停止关心任何事情(包括记录等)。基本上是某种忘我。
pass
也会发出请求并将结果返回给客户端,但会确保写入日志并且Varnish能够处理它自己的东西,而且你的VCL的deliver
功能也是调用,当您使用pipe
时不会发生。
答案 2 :(得分:3)
我的理解是,(管道)读取数据并将其直接写出来,并且(传递)读取数据,查看数据并将其写回客户端。后者添加了Varnish标题等,前者添加/减去任何内容。所以(管道)就好像Varnish不存在一样。
或者说另一种方式:我认为我的目标是与雪佛兰猫比较。 (管道)只是给你一个盒子。 (通过)先在框中查看。
(管道)也意味着在对beresp的调用(例如beresp)之前添加到请求的任何内容都将被丢弃。
有人可能会说你希望(管道)尽可能早地表现,但我怀疑你会发现它的任何指标都能真正支持这个论点。
答案 3 :(得分:1)
pipe
,其中不应修改或缓冲请求。
警告:pipe
将很乐意通过同一连接传输后续(keepalive)请求。这意味着Varnish不会添加任何X-Forwarded-For
标头,您将失去客户端的IP。