单独的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中进行了测试

  • 这是一个非常新的功能,它可能会改变

  • 我们非常希望得到反馈,这对您是如何起作用的