2011-09-07 54 views
0

我一直想疯了想弄清楚如何做到这一点的VCL,我开始认为这是不可能的。我有几台后端应用程序服务器可以服务于各种不同的主机。我需要清漆缓存任何主机的页面,并发送错过缓存的请求到具有请求中原始主机信息的应用程序服务器(“www.site.com”)。但是,所有的VCL示例似乎都要求我为后端服务器使用特定的主机名(例如,“backend1”)。有没有办法解决?我很乐意将缓存未命中指向IP,并保持请求主机完好无损。清漆循环主管与后端虚拟主机

这是我现在有:

backend app1 { 
    .host = "192.168.1.11"; 
    .probe = { 
      .url = "/heartbeat"; 
      .interval = 5s; 
      .timeout = 1 s; 
      .window = 5; 
      .threshold = 3; 
    } 
} 

backend app2 { 
    .host = "192.168.1.12"; 
    .probe = { 
      .url = "/heartbeat"; 
      .interval = 5s; 
      .timeout = 1 s; 
      .window = 5; 
      .threshold = 3; 
    } 
} 

director pwms_t247 round-robin { 
    { 
     .backend = app1; 
    } 
{ 
     .backend = app2; 
    } 
} 

sub vcl_recv { 
    # pass on any requests that varnish should not handle 
    if (req.request != "HEAD" && req.request != "GET" && req.request != "BAN") { 
    return (pass); 
    } 

    # pass requests to the backend if they have a no-cache header or cookie 
    if (req.http.x-varnish-no-cache == "true" || (req.http.cookie && req.http.cookie ~ "x-varnish-no-cache=true")) { 
    return (pass); 
} 

# Lookup requests that we know should be cached 
if (req.url ~ ".*") { 
    # Clear cookie and authorization headers, set grace time, lookup in the cache 
    unset req.http.Cookie; 
    unset req.http.Authorization; 
    return(lookup); 
} 

}

等等

这是我的第一个问题的StackOverflow,所以请让我知道如果我忘了提及一些重要的东西!谢谢。

回答

0

我需要清漆页面缓存任何主机和发送错过 缓存到应用服务器与在 请求(“www.site.com”)原始主机信息的请求。然而,所有的VCL例子似乎需要 我使用一个特定的主机名对我的后端服务器(“backend1”为例)

backend1不是一个主机名,它与一个后端定义IP地址。你在你的vcl文件中定义了一些路由逻辑(后端有一个请求被代理),但你并没有改变请求中的主机名。你所要求的(保持主机名相同)是默认行为。

+0

这在技术上是正确答案,常春藤。然而,最终导致问题的是我的探测请求没有任何主机信息,因此nginx不知道如何将心跳GET请求指向正确的虚拟主机。我通过手动完成探测请求解决了这个问题,我将在另一个答案中提出。 – jeremy6d

3

下面是我实际上的工作。我相信常春藤,因为他的答案在技术上是正确的,因为其中一个问题是我的主机(他们阻止端口,阻止我的正常Web请求通过)。我遇到的真正问题是,心跳消息没有主机信息,因此虚拟主机无法正确路由它们。下面是一个示例后端定义,其中包含一个可以完全自定义请求的探针:

backend app1 { 
    .host = "192.168.1.11"; 
    .port = "80"; 
    .probe = { 
      .request = "GET /heartbeat HTTP/1.1" 
         "Host: something.com" 
         "Connection: close" 
         "Accept-Encoding: text/html" ; 
      .interval = 15s; 
      .timeout = 2s; 
      .window = 5; 
      .threshold = 3; 
    } 
}