通过 Varnish 的多个虚拟主机,如果提供了不正确的后端
Posted
技术标签:
【中文标题】通过 Varnish 的多个虚拟主机,如果提供了不正确的后端【英文标题】:Multiple virtual hosts via Varnish, incorrect backend if served 【发布时间】:2012-08-17 14:23:31 【问题描述】:我设置了多个后端,在 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
有什么想法吗?
旁注,是否有更短的方法来定义我的后端?
【问题讨论】:
【参考方案1】:对于没有工作的网站,我没有将新的 Apache 端口添加到 VirtualHost 条目
我有
<VirtualHost *:80>
应该是
<VirtualHost *:80 *:81>
在新的 Apache 端口上工作
【讨论】:
【参考方案2】:顺便说一句,如果您在同一后端服务器上拥有站点,那么您不需要为每个站点定义新的后端。
【讨论】:
【参考方案3】:编辑:我的第一个答案是错误的。我误解了这个问题。
我的建议是调试并理解为什么它会因后端而有所不同:
在 if 语句之后禁用vcl_recv
中的所有缓存 return pass;
运行请求时运行 varnishlog
应该有帮助
【讨论】:
以上是关于通过 Varnish 的多个虚拟主机,如果提供了不正确的后端的主要内容,如果未能解决你的问题,请参考以下文章