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
指令导入该模块。
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