52

我们有一个服务器需要通过清漆服务多个域,例如 example1.com、example2.com 和 example3.com

我们当前的 .vcl 文件如下所示:

sub vcl_recv {
  set req.http.Host = "example1.com";    
  lookup;
}

如何为正确的传入请求设置正确的 req.http.Host?

4

4 回答 4

91

您可以通过这种方式支持多个前端域:

 backend example1 {
     .host = "backend.example1.com";
     .port = "8080";
 }
 backend example2 {
      .host = "backend.example2.com";
      .port = "8080";
 }
 sub vcl_recv {
    if (req.http.host == "example1.com") {
        #You will need the following line only if your backend has multiple virtual host names
        set req.http.host = "backend.example1.com";
        set req.backend = example1;
        return (lookup);
    }
    if (req.http.host == "example2.com") {
        #You will need the following line only if your backend has multiple virtual host names
        set req.http.host = "backend.example2.com";
        set req.backend = example2;
        return (lookup);
    }
 }
于 2010-07-30T16:02:40.367 回答
27

我正在使用类似于 Cristian 的设置,但在 if 子句中,我将 req.http.host 与正则表达式匹配:

#for www.example.com or example.com
if (req.http.host ~ "^(www\.)?example\.com$") {
        set req.backend = example_com;
        return (lookup);
}

#with any subdomain support
if (req.http.host ~ "^(.*\.)?example2\.com$") {
        set req.backend = example2_com;
        return (lookup);
}

不要忘记适当地设置后端!

于 2010-08-03T14:38:14.620 回答
11

无法添加评论,所以我们开始吧

清漆 4 的轻微修改

#for www.example.com or example.com
if (req.http.host ~ "^(www\.)?example\.com$") {
        set req.backend_hint = example_com;
        return (hash);
}

#with any subdomain support
if (req.http.host ~ "^(.*\.)?example2\.com$") {
        set req.backend_hint = example2_com;
        return (hash);
}

用 backend_hint 替换后端

于 2015-08-06T16:00:07.433 回答
7

我想为 Cristian Vidmar 和 msurovcak 的帖子添加更多细节

"(req.http.host == "example1.com") 模式:

我们已经使用所描述的模式在每台服务器上托管数十到数百个站点。

您可以在整个配置(vcl_fetch/vcl_backend_response、vcl_hash 等)中使用站点特定的自定义规则

if (req.http.host == "example1.com") {

需要的地方的例子。

将其与模板引擎相结合,允许通过包含自己逻辑的单个文件管理客户特定的配置(所有文件都包含在其站点特定的 if 块中以隔离代码)。

然后,您可以使用以下命令将每个单独的站点块包含到 default.vcl 中:

include "/etc/varnish/www.example1.com.vcl";

完全拆分后端的可选增强功能:

如果您托管完全不同的网站,那么拆分后端(和拆分缓存)是一个不错的选择。

如果站点相似(相同的代码库/js/css/图像),那么运行资源域可能会很有趣,例如。所有网站都使用的 resources.example.com。

然后,您可以在多个站点的每个公共元素中拥有一个缓存(并且命中率非常高),并且仍然在各个 www 站点上保持差异。

使用拆分后端的另一种选择:

另一种选择是通过容器拆分 Varnish 实例。然后每一个都成为它自己的孤立世界,单独管理(并且生死)。这可能是一个很好的安全选择,并且在现代基础架构上,多个进程的开销是最小的。

这样做的一些优点是您可以支持不同版本的 Varnish 和每个实例不同的 Varnish 启动参数。

这对于单独的日志记录非常有用,可以利用每个实例的不同 ESI 模式和单独的内存/调整配置设置。

我们在www.section.io这样做,它还使我们能够在不同的地理位置运行不同的容器或在不同的位置运行相同的容器,以尽可能接近地理上分散的用户群。

于 2015-08-06T02:36:16.273 回答