时间:2010-07-26 10:35:16

标签: configuration caching varnish

4 个答案:

答案 0 :(得分:87)

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

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

答案 1 :(得分:25)

我正在使用类似于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);
}

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

答案 2 :(得分:8)

无法添加评论,所以我们转到

清漆4的轻微修改

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

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

替换     后端 同     backend_hint

答案 3 :(得分:4)

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

"(req.http.host ==" example1.com")"图案:

我们使用所描述的模式为每台服务器托管数十到数百个网站。

您可以使用

在整个配置中继续使用特定于站点的自定义规则(vcl_fetch / vcl_backend_response,vcl_hash等)

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

示例在任何需要的地方。

将此与模板引擎相结合,允许通过包含自己逻辑的单个文件管理客户特定的配置(如果用于隔离代码,则所有文件都包含在特定于站点的位置)。

然后使用以下方法将每个站点块包含在default.vcl中:

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

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

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

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

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

使用拆分后端的另一种方法:

另一个选择是通过容器拆分Varnish实例。然后每个人都成为自己孤立的世界,单独管理(生活和死亡)。这可以是一个很好的安全选择,并且在现代基础设施上,多个流程的开销很小。

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

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

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