我在PHP机器前安装了一个Varnish。对于98%的页面,单个请求超时(VLC中的req.connect_timeout)有效。然而,我有几个页面,我们预计在它们超时之前需要3分钟。有没有办法在Varnish中为特定的请求设置req.connection_timeout?如果是的话,请给我看看VCL里的灯。我希望对所有页面都保持相同的req.connect_timeout,但对这几个特定页面提高这个数字。
发布于 2011-03-04 05:55:37
我认为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
}如果有效的话请告诉我。
发布于 2012-02-08 18:55:40
不幸的是,这不适用于清漆>3
非常可悲。似乎没有办法在v>3.0中真正实现这一点,我在这个问题上苦苦思索了几个小时。
我现在确实有了一个解决方案:
使用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。然后,我不得不(再次)体验到,不知何故,文档是错误的。需要显式声明"return(lookup)“。否则不调用vcl_miss。:(
发布于 2012-02-08 19:38:52
我会通过在Varnish中声明多个后端来解决它,每个后端都有不同的超时-但可能引用完全相同的IP和服务器。然后,您可以简单地为某些URL设置新的后端,以强制它们使用在那里声明的超时。
if (req.url ~ "[something]") {
set req.backend = backend_with_higher_timeout;
}https://stackoverflow.com/questions/5110841
复制相似问题