如何根据请求参数(路径、查询)将清漆中的请求路由到不断变化的后端服务器列表中



如何根据请求参数(路径、查询(将varnish中的请求路由到不断变化的后端服务器列表中。其中每个请求都可以由特定的后端服务器处理。

一个简单的例子

下面是一个简单的示例,您将在其中检查req.url并查找正确的路径和querystring。根据该值,将选择后端:

vcl 4.1;
backend backend1 {
.host = "backend1.example.com";
.port = "80";
}
backend backend2 {
.host = "backend2.example.com";
.port = "80";
}
sub vcl_recv {
if(req.url ~ "/?action=foo") {
set req.backend_hint = backend1;
} else {
set req.backend_hint = backend2;
}

}

您可以使逻辑变得任意复杂,并根据需要添加许多if语句。

限制

上面的例子有3个非常具体的限制:

  1. 后端是静态的,应该在VCL中明确定义
  2. DNS主机名在编译时解析,运行时不会注意到DNS更改
  3. 您不能使用请求或运行时信息来组成后端的主机名

我注意到你的问题中有术语a changing list of backends。我不确定静态后端会在多大程度上影响你。但如果他们这样做了,唯一真正的解决方案就是在Varnish Enterprise中使用动态后端

Varnish Enterprise中的动态后端

Varnish Enterprise的商业版Varnish提供了一个动态后端模块,可以绕过这些限制。

可以动态定义后端,并在DNS TTL到期时发现DNS更改。

这里有一个例子:

vcl 4.1;
import goto;
backend default none;
sub vcl_backend_fetch {
if(bereq.url ~ "^/(images|videos|static)/?country=(us|uk|fr|jp)") {
}
set bereq.backend = goto.dns_backend(regsub(bereq.url,"^/(images|videos|static)/?country=(us|uk|fr|jp)","1.2.backend.example.com"));
}

当请求URL为/images/?country=uk时,后端将变为images.uk.backend.example.com

这只是一个假设的例子。我想说的是,您可以动态定义后端,并在运行时发现DNS更改。

请参阅https://docs.varnish-software.com/varnish-cache-plus/vmods/goto/如果您想在VarnishEnterprise中了解更多关于动态后端的信息。

Varnish Enterprise免责声明

这篇文章不是Varnish Enterprise的广告。如果你能用开源Varnish解决你的问题,那绝对没问题。

如果Varnish Cache会限制您的使用情况,那么Varnish Enterprise可以解决这个问题。

尽管Varnish Enterprise是一款需要购买许可证的商业软件,但也有一些廉价的入门方法。

如果您在AWS、Azure或Google Cloud等云平台上运行或测试应用程序,您可以使用我们的Varnish Enterprise机器映像,而无需提前购买许可证。

许可证费用由云平台按小时计费,并提供免费试用。一些平台甚至有一个更便宜的";开发者版";允许您在较小的云实例上测试Varnish Enterprise。

相关内容

  • 没有找到相关文章