2011-02-24 92 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; 
    } 
} 
相關問題