有没有办法为varnish中的特定请求设置req.connection_timeout?
我有一个坐在PHP机器前面的Varnish设置。对于98%的页面,单个请求超时(VLC中的req.connect_timeout
)有效。然而,我有几页,我们预计需要3分钟才会超时。有没有办法为varnish中的特定请求设置req.connection_timeout?如果是这样,请向我展示VCL中的灯光。我想为所有页面保留相同的req.connect_timeout
,但为这几个特定页面提高这个数字。有没有办法为varnish中的特定请求设置req.connection_timeout?
我认为connection_timeout限制了建立连接到后端的时间,first_byte_timeout和between_bytes_timeout限制了处理时间。你有没有尝试以编程方式在vcl_recv中设置bereq.first_byte_timeout?例如。喜欢的东西:
backend mybackend {
.host = "127.0.0.1";
.port = "8080";
.connect_timeout = 100ms;
.first_byte_timeout = 5s;
.between_bytes_timeout = 5s;
}
sub vcl_recv {
set req.backend = mybackend;
if (req.url ~ "/slowrequest") {
# set req.connect_timeout = 180s; # old naming convention?
set bereq.connect_timeout = 180s;
}
# .. do default stuff
}
让我知道,如果它的工作原理...
不幸的是,这并不清漆> 3
很心痛工作。似乎没有办法真正实现这个目标。
我现在有一个解决方案:
使用vcl_miss!
下面是一个例子:
sub vcl_recv {
set req.backend = director_production;
if (req.request == "POST") {
return(pipe);
}
else {
return(lookup);
}
}
sub vcl_miss {
if (req.url ~ "/longrunning") {
set bereq.first_byte_timeout = 1h; # one hour!
set bereq.between_bytes_timeout = 10m;
} else {
set bereq.first_byte_timeout = 10s;
set bereq.between_bytes_timeout = 1s;
}
}
这对我的作品。 让我担心的是varnish的文档指出,当在缓存中找不到am对象时总是调用vcl_miss。在我的第一个版本中,我忽略了vcl_recv中的if/else。然后,我不得不再次体验文档是错误的。需要明确说明“返回(查找)”。否则,不会调用vcl_miss。 :(
我会通过在varnish中声明多个后端来解决它,每个后端都有一个不同的超时时间 - 但可能指的是同一个IP和服务器,然后你可以简单地为某些URL设置一个新的后端,使用宣称有超时
if (req.url ~ "[something]") {
set req.backend = backend_with_higher_timeout;
}
在VCL 4.0,你可以定义你的后端和清漆提示使用它:
sub vcl_recv {
if (req.method == "POST" && req.url ~ "^/admin") {
set req.backend_hint = backend_admin_slow;
}
}
会给这个一杆谢谢 – buley 2011-03-05 20:35:22
3不起作用。!。 x,如@der_do所述 – 2013-06-23 13:31:43