用光油configuration多个站点

我们有一个服务器需要服务于多个域名,例如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与正则expression式匹配:

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

不要忘记适当设置后端!

无法添加评论,所以我们走了

对清漆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_hintreplace后端

我想为Cristian Vidmar和msurovcak的post增加更多的细节

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

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

您可以在整个configuration(vcl_fetch / vcl_backend_response,vcl_hash等)中继续使用站点特定的自定义规则

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

例如需要的地方。

将其与模板引擎相结合,允许通过包含自己的逻辑的单个文件(全部用他们的站点特定的块来隔离代码)来pipe理客户特定的configuration。

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

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

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

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

如果站点是相似的(相同的codebase / js / css / images),运行一个资源域比较有趣。 所有网站使用的resources.example.com。

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

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

另一种select是通过容器分割清漆实例。 然后,每个人都成为自己独立pipe理的世界(和生与死)。 这可能是一个很好的安全选项,现代基础设施上的多个进程的开销是最小的。

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

对于单独的日志logging来说,这非常棒,利用每个实例的不同ESI模式以及单独的内存/调整configuration设置。

我们在www.section.io上做到这一点 ,它还使我们能够在不同的地理位置运行不同的集装箱,或者在不同地点运行相同的集装箱,以尽可能接近地理上分散的用户群。