varnish介绍
Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,使用内存缓存,性能优秀.以下是varnish和其它软件的对比:
varnish原理
从客户端接收请求然后尝试从缓存中获取数据来响应客户端的请求,如果varnish不能从缓存中获得数据来响应客户端,它将转发请求到后端(backend servers),获取响应同时存储,最后交付给客户端。
varnish安装(ubuntu)
sudo apt-get install apt-transport-https
sudo curl https://repo.varnish-cache.org/ubuntu/GPG-key.txt | apt-key add -
echo "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list
sudo apt-get update
sudo apt-get install varnish
varnish快速使用(1)编辑
/etc/varnish/default.vcl中
backend default部分:
backend default {
.host = "www.phpddt.com";
.port = "80";
}
(2)启动varnish
/usr/sbin/varnishd -P /run/varnishd.pid -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
(3)参数选项说明:
- -f 指定 varnish 的配置文件位置
- -s 指定 varnish 缓存存放的方式,常用的方式有:“-s file,<dir_or_file>,<size>”。
- -T address:port 设定 varnish 的 telnet 管理地址及其端口
- -a address:port 表示 varnish 对 http 的监听地址及其端口
varnish配置
(1)VCL配置语言介绍
Varnish使用领域专用语言(DSL)作为Varnish配置语言,简写VCL.
- 块是由花括号分隔,语句以分号结束,使用‘ # ’符号可以添加注释。
- VCL 使用指定运算符“=”、比较运算符“==”、逻辑运算符“!,&&,!!”等形式,还支持正则表达式和用“~”进行 ACL 匹配运算。
- VCL 没有用户自己定义的变量,你可以在 backend、request 或 object 上设置变量值,采用 set 关键字进行设置。例如 set req.backend = director_employeeui;
- 两个字符串的连接,他们之间没有任何运算符
(2)后端集合director
VCL 可以把多个 backends 聚合成一个组,这些组被叫做 director,这样可以增强性能和弹力,当组里一个 backend 挂掉后,可以选择另一个健康的 backend。VCL 有多种 director,不同的 director 采用不同的算法选择 backend,主要有以下几种:
- Random director 会根据所设置的权值(weight)来选择 backend,.retries 参数表示尝试找到一个 backend 的最大次数,.weight 参数表示权值
- Round-robin director 在选择 backend 时,会采用循环的方式依次选择。
- Client director 根据 client.identity 来选择 backend,您可以设置 client.identity 的值为 session cookie 来标识 backend。
(3)使用probe进行健康检测
backend server1 {
.host = "server1.example.com";
.probe = {
.url = "/test.jpg"; //哪个 url 需要 varnish 请求
.interval = 5s; //检查的时间间隔
.timeout = 1 s; //等待多长时间超时
.window = 5; //维持 5 个 sliding window 的结果
.threshold = 3; //至少有三次 window 是成功的,就宣告 backend 健康
}
}
backend server2 {
.host = "server2.example.com";
.probe = {
.url = "/test.jpg";
.interval = 5s;
.timeout = 1 s;
.window = 5;
.threshold = 3;
}
}
(4)VCL 内置函数
vcl_recv 函数用于接收和处理请求。当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求。例如如何响应、怎么响应、使用哪个后端服务器等。
vcl_pipe 函数此函数在进入 pipe 模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个连接被关闭。
vcl_pass 函数此函数在进入 pass 模式时被调用,用于将请求直接传递至后端主机。后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存,在当前连接下每次都返回最新的内容
vcl_hash 函数当您想把一个数据添加到 hash 上时,调用此函数。
vcl_hit 函数在执行 lookup 指令后,在缓存中找到请求的内容后将自动调用该函数。
vcl_miss 函数在执行 lookup 指令后,在缓存中没有找到请求的内容时自动调用该方法。此函数可用于判断是否需要从后端服务器获取内容
vcl_fetch 函数在后端主机更新缓存并且获取内容后调用该方法,接着,通过判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。
vcl_deliver 函数将在缓存中找到请求的内容发送给客户端前调用此方法。
vcl_error 函数 出现错误时调用此函数。
简单例子:
当匹配img的URL时,需把请求发送到上面定义的backend img,其他的请求发送到backend webserver。
sub vcl_recv {
if (req.url ~ "^/img/") {
set req.backend = img;
} else {
set req.backend = webserver.
}
}
参考资料
- http://www.ibm.com/developerworks/cn/opensource/os-cn-varnish-intro/#resources
- https://www.varnish-cache.org/docs/4.0/users-guide/index.html