Optimization Varnish,具有提前退出功能的自定义子例程

Optimization Varnish,具有提前退出功能的自定义子例程,optimization,varnish,varnish-vcl,Optimization,Varnish,Varnish Vcl,我不熟悉清漆。在编辑后端选择器子例程时,我发现自己在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 "Forb

我不熟悉清漆。在编辑后端选择器子例程时,我发现自己在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;
}
如果没有正确的return/exit语句,就有可能(随着文件变得越来越复杂)更改两次后端。
是否可以使用提前返回模式来避免这种情况?如果没有,我如何避免使用
If
/
elseif
模式而不浪费性能?

目前没有好的方法可以做到这一点,正如所解释的:

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
应该没有机会设置两次备份。如果保持独立的
如果{}
块,则可能会发生这种情况。

目前没有很好的方法可以做到这一点,正如

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
应该没有机会设置两次备份。如果保持独立的
如果{}
块,则可能会发生这种情况。

目前没有很好的方法可以做到这一点,正如

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
应该没有机会设置两次备份。如果保持独立的
如果{}
块,则可能会发生这种情况。

目前没有很好的方法可以做到这一点,正如

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
应该没有机会设置两次备份。如果将{}块分开,则会发生这种情况