有没有办法为Varnish中的特定请求设置req.connection_timeout?

时间:2011-02-24 21:42:55

标签: varnish

我在PHP机器前面有一个Varnish设置。对于98%的页面,单个请求超时(VLC中为req.connect_timeout)有效。然而,我有几页,我们预计它们会在超时之前花费3分钟。有没有办法为Varnish中的特定请求设置req.connection_timeout?如果是这样,请告诉我VCL的灯光。我想为所有页面保留相同的req.connect_timeout,但为这几个特定页面提高该数字。

5 个答案:

答案 0 :(得分:3)

不幸的是,这不适用于清漆> 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的文档声明,当在缓存中找不到对象时,总是调用vcl_miss。在我的第一个版本中,我在vcl_recv中省略了if / else。然后我不得不再次体验文档是错误的。需要明确说明“返回(查找)”。否则不会调用vcl_miss。 :(

答案 1 :(得分:2)

我会通过在Varnish中声明多个后端来解决它,每个后端都有不同的超时 - 但可能是指同一个IP和服务器。然后,您只需为某些URL设置新的后端,以强制它们使用在那里声明的超时。

if (req.url ~ "[something]") {
     set req.backend = backend_with_higher_timeout;
}

答案 2 :(得分:1)

我认为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 :(得分:1)

在VCL 4.0中,您可以定义后端并提供清漆提示以使用它:

sub vcl_recv {
    if (req.method == "POST" && req.url ~ "^/admin") {
        set req.backend_hint = backend_admin_slow;
    }
}

答案 4 :(得分:0)

使用vcl_backend_fetch并在那里设置超时时间:

sub vcl_backend_fetch { if (bereq.method == "POST" && bereq.url == "/slow") { set bereq.first_byte_timeout = 300s; } }