代码之家  ›  专栏  ›  技术社区  ›  Tom

使用Varnish配置多个站点

  •  47
  • Tom  · 技术社区  · 14 年前

    我们的服务器需要为多个域提供服务,例如example1.com、example2.com和example3.com

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

    4 回复  |  直到 11 年前
        1
  •  91
  •   Cristian Vidmar    14 年前

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

     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);
        }
     }
    
        2
  •  26
  •   msurovcak    14 年前

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

    别忘了适当地设置后端!

        3
  •  11
  •   hyena    3 年前

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

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

    代替 后端 后端\u提示

        4
  •  6
  •   mattnthat    9 年前

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

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

    您可以使用

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

    任何需要的例子。

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

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

    对完全分离后端的可选增强:

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

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

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

    另一种选择是通过容器分割出清漆实例。每一个都变成了它自己的孤立世界,被单独管理(以及生与死)。这是一个很好的安全选项,在现代基础设施上,多个进程的开销是最小的。

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

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

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