清漆,自定义子程序,提前退出

时间:2015-03-16 13:03:42

标签: optimization varnish varnish-vcl

我是Varnish的新手。在编辑我们的后端选择器子程序时,我发现自己在Varnish配置文件中寻找早期返回模式。

sub select_backend {
  if (req.http.host ~ "tracking\..*") {
    set req.backend = tracking;
  }

  if (req.http.host ~ "myapp1.domain.com") {
    if (req.url ~ "^/insecure/path") {
      error 403 "Forbidden";
    }
    set req.backend = app1;
  }

  if (req.http.host ~ "myapp2.domain.com") {
    set req.backend = app2;
  }
}

sub vcl_recv {
  // other stuffs
  call select_backend;
}

如果没有正确的返回/退出语句,则存在风险(因为文件变得越来越复杂)以改变后端的两倍。 是否可以使用早期返回模式来避免这种情况?如果没有,我如何避免if / elseif模式而不浪费性能?

1 个答案:

答案 0 :(得分:2)

目前没有好办法,Syntax part of VCL Basics解释说:

  

"返回" VCL语句将控制权从VCL状态引擎返回到Varnish。如果您定义自己的函数并从其中一个默认函数调用它,请键入" return(foo)"不会将执行从您的自定义函数返回到默认函数,而是将执行从VCL返回到Varnish。这就是为什么我们说VCL有终止语句,而不是传统的返回值。

Some other people有类似的需求,建议是:

  if (req.http.host ~ "tracking\..*") {
    set req.backend = tracking;
  } elsif (req.http.host ~ "myapp1.domain.com") {
    if (req.url ~ "^/insecure/path") {
      error 403 "Forbidden";
    }
    set req.backend = app1;
  } elsif (req.http.host ~ "myapp2.domain.com") {
    set req.backend = app2;
  }

如果保留模式if .. elsif,则应该没有机会将支持设置为两次。如果您保留单独的if { }块,则可以发生这种情况。