单独的VCL文件¶
在同一个Varnish中有多个不同的vhost是一个非常典型的用例,从Varnish 5.0开始,可以为不同的vhost或任何其他不同的请求子集使用单独的VCL文件。
假设我们想要处理 varnish.org
使用一个VCL文件和 varnish-cache.org
使用另一个VCL文件。
首先加载两个VCL文件::
vcl.load vo_1 /somewhere/vo.vcl
vcl.load vc_1 /somewhere/vc.vcl
这些都是100%普通的VCL文件,如果您只在Varnish实例上运行该单个域,它们看起来会是什么样子。
接下来,我们需要将VCL标签指向它们::
vcl.label l_vo vo_1
vcl.label l_vc vc_1
接下来,我们编写顶级VCL程序,该程序根据请求::中的主机:标头扩展到其他两个程序
import std;
# We have to have a backend, even if we do not use it
backend default { .host = "127.0.0.1"; }
sub vcl_recv {
# Normalize host header
set req.http.host = std.tolower(req.http.host);
if (req.http.host ~ "\.?varnish\.org$") {
return (vcl(l_vo));
}
if (req.http.host ~ "\.?varnish-cache\.org$") {
return (vcl(l_vc));
}
return (synth(302, "http://varnish-cache.org"));
}
sub vcl_synth {
if (resp.status == 301 || resp.status == 302) {
set resp.http.location = resp.reason;
set resp.reason = "Moved";
return (deliver);
}
}
最后,我们加载顶级VCL并使其成为活动的VCL::
vcl.load top_1 /somewhere/top.vcl
vcl.use top_1
如果要更新其中一个分离的VCL,请加载新的VCL并更改标签以指向它::
vcl.load vo_2 /somewhere/vo.vcl
vcl.label l_vo vo_2
如果要更改顶级VCL,请像往常一样执行以下操作:
vcl.load top_2 /somewhere/top.vcl
vcl.use top_2
详情、详情、详情:¶
所有请求 always 从活动的VCL开始-从
vcl.use
只有VCL标签可以用于
return(vcl(name))
。如果没有此限制,则每次更改一个单独的VCL时,顶层VCL都必须重新加载。您只能从激活的VCL切换VCL。如果您尝试从其中一个单独的VCL,您将得到503
您不能移除VCL标签(使用
vcl.discard
)如果任何VCL包含return(vcl(name_of_that_label))
您不能移除贴有标签的VCL。
此代码在测试用例c00077中进行了测试
这是一个非常新的功能,它可能会改变
我们非常希望得到反馈,这对您是如何起作用的