使用后端虚拟主机的清漆循环导演

时间:2011-09-07 14:15:27

标签: varnish

我一直在试图像疯了一样找出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问题,如果我忽略了重要的事情,请告诉我!感谢。

2 个答案:

答案 0 :(得分:3)

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

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;
  }
}

答案 1 :(得分:0)

  

我需要清漆来缓存任何主机的页面并发送错过的请求   具有原始主机信息的应用服务器的缓存   请求(“www.site.com”)。但是,所有VCL示例似乎都需要   我为我的后端服务器使用特定的主机名(例如“backend1”)

backend1 不是主机名,它是带有ip-address的后端定义。您在vcl文件中定义了一些路由逻辑(代理请求的后端),但您没有更改请求中的主机名。您要求的(保持主机名相同)是默认行为。