多个虚拟主机通过Varnish,如果提供不正确的后端

时间:2012-08-22 07:43:03

标签: virtualhost backend varnish vhosts

我设置了几个后端,在VCL中检测到每个后端,然后应用正确的设置。这适用于某些网站,但有一些网站指向同一网站。

我已经阅读并应用了这个,它适用于某些人,但不适用于其他人。

Configure multiple sites with Varnish

例如我定义了一些后端:

backend site4 {
    .host = "127.0.0.1";
    .port = "81";
}

backend site3 {
    .host = "127.0.0.1";
    .port = "81";
}

backend site2 {
    .host = "127.0.0.1";
    .port = "81";
}

backend site1 {
    .host = "127.0.0.1";
    .port = "81";
}

然后在vcl_recv中设置主机和正确的后端:

if (req.http.host ~ "(?i)^(www.)?site1.co.uk") 
{
    set req.http.host = "www.site1.co.uk";
    set req.backend = site1;   
} 
elsif (req.http.host ~ "(?i)^(www.)?site2.co.uk") 
{
    set req.http.host = "www.site2.co.uk";
    set req.backend = site2;   
} 
elsif (req.http.host ~ "(?i)^(www.)?site3.com") 
{
    set req.http.host = "www.site3.com";
    set req.backend = site3;
} 
elsif (req.http.host ~ "(?i)^(www.)?site4.net") 
{
    set req.http.host = "www.site4.net";
    set req.backend = site4;
} 

www.site1.co.uk与www.site2.co.uk一样有效,但www.site3.com和www.site4.net都显示了www.site2.co.uk的内容 - 它就像它的忽略我的后端,只为某些网站使用同一个。

主机设置正确,因为如果我这样做:

curl -I http://site3.com

vcl_fetch

中使用以下内容时
set beresp.http.X-Host = req.http.host;  

我可以看到主机已正确设置为www.site3.com

任何想法?

旁注,是否有更短的方法来定义我的后端?

3 个答案:

答案 0 :(得分:2)

顺便说一句,如果您在同一个后端服务器上有站点,那么您不需要为每个站点定义新的后端。

答案 1 :(得分:1)

编辑:我的第一个回答是错误的。我误解了这个问题。

我建议你,根据后端调试并理解它的不同之处:

  • 在if语句
  • 之后禁用return pass;中的所有缓存vcl_recv
  • 运行请求时运行 varnishlog

应该有帮助

答案 2 :(得分:0)

对于没有工作的网站,我没有将新的Apache端口添加到VirtualHost条目

我有

<VirtualHost *:80>

需要

<VirtualHost *:80 *:81>

使用新的Apache端口