我在 PHP 机器前面有一个 Varnish 设置。对于 98% 的页面,单个请求超时(req.connect_timeout
在 VLC 中)有效。但是,我有几页,我们预计它们最多需要 3 分钟才能超时。有没有办法为 Varnish 中的特定请求设置 req.connection_timeout ?如果是这样,请告诉我VCL中的灯。我想req.connect_timeout
对所有页面保持相同,但为这几个特定页面提高这个数字。
5 回答
不幸的是,这不适用于清漆> 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。然后我不得不(再次)体验到文档是错误的。需要明确说明“返回(查找)”。否则不调用 vcl_miss。:(
我会通过在 Varnish 中声明多个后端来解决它,每个后端都有不同的超时时间——但可能指的是相同的 IP 和服务器。然后,您可以简单地为某些 URL 设置一个新的后端,强制它们使用那里声明的超时。
if (req.url ~ "[something]") {
set req.backend = backend_with_higher_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
}
让我知道它是否有效...
在 VCL 4.0 中,您可以定义您的后端并提供 varnish 提示以使用它:
sub vcl_recv {
if (req.method == "POST" && req.url ~ "^/admin") {
set req.backend_hint = backend_admin_slow;
}
}
使用 vcl_backend_fetch 并在那里设置超时:
sub vcl_backend_fetch {
if (bereq.method == "POST" && bereq.url == "/slow") {
set bereq.first_byte_timeout = 300s;
}
}