varnish学习笔记-后端服务器

varnish学习笔记-后端服务器

大部分情况下,varnish发给客户端的数据都不是自己产生的,而是从后端服务器获取的(如果发的是缓存的内容,其起源也是后端服务器),它充当的是反向代理和缓存的角色。

所以需要给varnish定义一个/多个后端服务器,告诉它应该从哪里获取数据,可以选择性的让它从指定服务器获取数据。

1. 定义一个后端服务器

使用backend指令来定义一个后端服务器。最简单的代码如下:

backend default { # 该后端服务器的名字为 default,后面可以用default来引用它
  .host = "127.0.0.1"; # 指定后端服务器的IP
  .port = "8080";      # 指定后端服务器的端口
}

vcl_recv子程序中可以用req.backend_hint = default来显式地指定请求命中的后端服务器。如:

sub vcl_recv {
  set req.backend_hint = default;
}

2. 定义多个后端服务器

也可以用backend指令定义多个后端服务器。

backend default {
  .host = "127.0.0.1";
  .port = "8080";
}

backend php {
  .host = "127.0.0.1";
  .port = "8180";
}

.backend java {
  .host = "127.0.0.1";
  .port = "8000"
}

如上代码定义了defaultphpjava三个后端服务器。

这三个后端服务器又该如何使用呢?假如php是由Apache担当,专门处理.php文件,java是由Tomcat 担当,专门处理 .jsp文件,其它的文件则交给default对应的服务器来处理。则varnish的配置文件可以这样写:

vcl_recv {
  if (req.url ~ "(?i)\.php") {
    set req.backend_hint = php;
  } elsif (req.url ~ "(?i)\.jsp") {
    set req.backend_hint = java;
  } else {
    set req.backend_hint = default;
  }
}

如果没有显式选择后端服务器的话,varnish会选择名为default的后端服务器,如果没有名为default的后端服务器的话,则选择vcl配置文件中第一个找到的后端服务器。

3.支持虚拟主机

上面我们是根据请求的url(req.url)来选择后端服务器的,当然也可以根据其他条件来选择后端服务器。

varnishs也可以支持虚拟主机,这是通过HTTP的Host请求头来实现的。如:

sub vcl_recv {
  if (req.http.host == "api.mysite.com") {
    set req.backend_hint = api; # 假设已经定义了一个名为 api 的后端服务器
  } elsif (req.http.host == "app.mysite.com") {
    set req.backend_hint = app;  # 假设已经定义了一个名为 app 的后端服务器
  }
}

4. 负载均衡 directors

当有多个后端服务器提供同样的服务时,varnish支持以负载均衡的方式向他们请求内容。该功能 由directors模块提供,directors模块是varnish的一个内置模块,另一个内置模块是std

使用模块前要用import指令导入该模块。

import directors;

需要在vcl_init子程序中定义一个后端服务器组。

sub vcl_init {
  new my_servers = directors.round_robin(); # 负载均衡为轮询模式
  my_servers.add_backend(server1); # 假设已经定义了一个名为 server1 的后端服务器
  my_servers.add_backend(server2); # 假设已经定义了一个名为 server2 的后端服务器
}

然后在vcl_recv中把请求命中到一个后端服务器组。

sub recv {
  set req.backend_hint = my_servers.backend();
}

负载均衡还有其它模式,如random —— 随机选择一个后端服务器,hash —— 有会话保持功能的均衡。

add_backend方法还可以支持传第二个参数(real类型)作为权重。

有关directors模块的更多内容可参考 directors模块

5.健康检查

负载均衡器一般都有健康检查的功能,按指定的时间间隔、指定的检查规则对后端服务器进行检查,判断后端服务器是否正常,如果不正常,则需要从后端服务器获取数据时,不向它发起请求。

varnish的健康检查示例配置如下:

backend server1 {
    .host = "server1.example.com";
    .probe = {
        .url = "/";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

backend server2 {
    .host = "server2.example.com";
    .probe = {
        .url = "/";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

以上配置表示每隔5秒向后端服务器发起请求,超时为1秒,请求的路径为"/",最近5个请求中有3个成功就认为后端服务器是OK的。

关于varnish后端服务器的学习就到此,详情可以参考官方文档

varnish VCL的文档可参考 https://varnish-cache.org/docs/5.2/reference/vcl.html

猜你喜欢

转载自blog.csdn.net/chunyuan314/article/details/81178353