天天看点

varnish学习笔记-后端服务器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"
}
           

如上代码定义了

default

php

java

三个后端服务器。

这三个后端服务器又该如何使用呢?假如

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

指令导入该模块。

需要在

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 = s;
        .interval = s;
        .window = ;
        .threshold = ;
    }
}

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

以上配置表示每隔5秒向后端服务器发起请求,超时为1秒,请求的路径为

"/"

,最近5个请求中有3个成功就认为后端服务器是OK的。

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

varnish

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

继续阅读