Configuration 使用Varnish配置多个站点
我们有一台服务器,需要通过varnish服务多个域,例如example1.com、example2.com和example3.com 我们当前的.vcl文件如下所示: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
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