2011-02-24 90 views
1

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

回答

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 
} 

让我知道,如果它的工作原理...

+0

会给这个一杆谢谢 – buley 2011-03-05 20:35:22

+0

3不起作用。!。 x,如@der_do所述 – 2013-06-23 13:31:43

3

不幸的是,这并不清漆> 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。 :(

2

我会通过在varnish中声明多个后端来解决它,每个后端都有一个不同的超时时间 - 但可能指的是同一个IP和服务器,然后你可以简单地为某些URL设置一个新的后端,使用宣称有超时

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

在VCL 4.0,你可以定义你的后端和清漆提示使用它:

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