1

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

4

5 回答 5

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

于 2012-02-08T10:55:39.797 回答
2

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

if (req.url ~ "[something]") {
     set req.backend = backend_with_higher_timeout;
}
于 2012-02-08T11:38:51.900 回答
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
}

让我知道它是否有效...

于 2011-03-03T21:55:37.493 回答
1

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

sub vcl_recv {
    if (req.method == "POST" && req.url ~ "^/admin") {
        set req.backend_hint = backend_admin_slow;
    }
}
于 2014-11-19T16:34:30.123 回答
0

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

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

于 2018-11-25T21:05:24.877 回答