Varnish,提前退出的自定义子程序

问题描述 投票:0回答:2

我是清漆新手。在编辑后端选择器子例程时,我发现自己在 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
模式而不浪费性能?

optimization varnish varnish-vcl
2个回答
5
投票

目前没有好的方法可以做到这一点,正如VCL基础知识的语法部分解释的那样:

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

其他一些人也有类似的需求,建议是:

  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 { }
块,则可能会发生这种情况。


0
投票

从今天开始,您只需

return;
(无需任何操作)从用户定义的子程序中提前退出。

© www.soinside.com 2019 - 2024. All rights reserved.