Configuration 使用Varnish配置多个站点

Configuration 使用Varnish配置多个站点,configuration,caching,varnish,Configuration,Caching,Varnish,我们有一台服务器,需要通过varnish服务多个域,例如example1.com、example2.com和example3.com 我们当前的.vcl文件如下所示: sub vcl_recv { set req.http.Host = "example1.com"; lookup; } 如何为正确的传入请求设置正确的req.http.Host?您可以通过以下方式支持多个前端域: backend example1 { .host = "backend.example

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

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

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

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

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

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

我使用的设置与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);
}

别忘了适当地设置后端

我想为克里斯蒂安·维德玛和姆苏罗瓦卡的帖子添加更多细节

模式:

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

您可以使用

if(req.http.host==“example1.com”){

在需要的地方举个例子

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

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

包括“/etc/varnish/www.example1.com.vcl”

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

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

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

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

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

另一种选择是通过容器分割Varnish实例。然后每个实例都成为它自己的独立世界,并分别进行管理(以及生存和死亡)。这是一个很好的安全选择,而且在现代基础设施上,多个进程的开销是最小的

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

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


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

无法添加评论,因此我们开始

对清漆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

这是否也与www.backend1.com和backend1.com匹配?如果您有
返回(查找)
,post可能不起作用,因为Varnish会隐藏任何post请求以获取请求。删除此代码,它就会起作用。这太棒了。将您的答案和msurovcak的答案结合使用,但这非常有用。如果您正在非标准端口上收听(可能是在测试时),这是一个不错的选择,端口号必须包含在测试中。如果(req.http.host==“example.com:8080”){在Varnish 4中,
req.backend
是到
req.backend\u hint
。我可以添加
返回(查找)
是不必要的--varnish默认情况下也可以使用物理ip而不是域名作为后端,如
后端ipaddr1{.host=“xxx.xxx.xxx.xxx”
IMHO,您应该编辑此答案并使其完整(即添加后端,等等)。非常好的回答,不应该使用查找,因为在复杂的配置中,Varnish 4的子vcl_recv中有许多其他内容
lookup
hash
替换。现在应该使用
return(hash);
来代替
vcl_recv
现在必须返回
hash