此博文针对varnish3.x系列,有些知识不适合最新的varnish4.x,望广大博友知晓;
本次只有基础知识跟介绍,详细的安装、生产引用后面一一呈现!!!
一、varnish简介
varnish是一款高性能、配置灵活、管理方便的代理缓存软件,在缓存软件中它与传统的squid相比是一个新贵,具有配置灵活、运行速度快、管理更加方便等优点.
二、varnish的软件架构系统介绍:
1. varnish的软件系统架构类似于Nginx的master-worker,varnish主要有两个进程:management和child进程;
2. management进程主要的功能是:应用新的配置,管理编译器编译vcl配置文件,监控varnish child进程状态、初始化varnish以及提供一个varnish的命令行接口;
3. child进程,也常被称之为cache进程,每个child进程中包含有很多线程,常见的线程主要有:
acceptor线程:主要负责接收新的请求并相应;
worker线程:child进程会为每个会话分配一个worker线程
Expiry线程:从缓冲中清理过期的内容
4. varnish的工作架构图:
三、varnish的配置语言VCL:
1. varnish的配置文件采用了varnish自己独特的配置语言VarnishConfiguration Language (VCL),VCL是一种简单的编程语言,仅支持有限的算术运算和逻辑运算操作,支持正则表达式进行字符串的匹配、允许用户使用set自定义变量、支持if判断语句,但是不支持循环语句;
2. varnish需要通过management将其转换成C代码,再有GCC编译器将C代码编译成二进制文件才能被varnish进程所调用使用;
3. management在将vcl转换成C代码的时候会去检测vcl语法的正确性,如果不正确的会抛出错误并且不去转换,有效的避免了装载错误配置文件的风险;
4. VCL语法:
1). //、#或/* comment */用于注释;
2). sub$name 定义函数;
3). 不支持循环,有内置变量;
4). 使用终止语句,没有返回值;
5). 域专用;
6)操作符:=(赋值)、==(等值比较)、~(模式匹配)、!(取反)、&&(逻辑与)、||(逻辑或);
四、varnish的日志功能:
1. varnish有记录日志的功能,但是它的特殊之处在于varnish的日志是存储在内存里面的,默认为内存保留的空间为90M,超过90M就会清楚最起初的日志记录新日志;
2. 要想获取日志信息,我们可以通过命令接口的方式或者工具去获取日志,这样的工具有varnishlog、varnishncsa或varnishstat;
3. varnish的日志分为两部分,第一部分是计数器,第二部分为客户端请求的数据;
五、varnish缓存对象的存储:
varnish支持将缓存的对象存储在不同的介质中,我们可以在varnish启动的使用使用-s选项来指定缓存的存储类型;
file:使用特定的文件存储全部的缓存数据,并且通过操作系统mmap()系统调用将整个缓存文件映射至内存区域;
malloc:使用malloc()库调用在varnish启动时向操作系统申请指定大小的内存空间以存储缓存对象;
persistent:与file的功能相同,但是它可以实现持久存储,但是这个功能目前还尚不稳定,处于测试期;
根据官方资料记载,每个缓存对象会大约多占用1K左右的存储空间,所以大约没100万个对象就会多占用1G的空间(处于性能跟稳定性方面考虑,推荐使用malloc);
六、varnish的几个重要的内置函数
vcl_recv:
vcl_recv是在varnish完成对请求的报文的解码为基本数据结构后第一个要执行的子例程,它的主要作用有:
1. 修改客户端的数据以减少缓存对象的差异性,比如删除URL中的www字符等;
2. 基于客户端数据选用缓存策略,比如仅缓存特定的URL请求,不缓存POST请求等;
3. 为web应用程序执行URL重写规则;
4. 挑选合适的后端web服务器;
注:vcl_recv也可以通过精巧的策略完成一定意义上的安全功能,以将某些特定的攻击扼杀于摇篮中。同时,它也可以检查出一些拼写类的错误并将其修正等;
varnish默认的vcl_recv函数主要有两个功能:仅处理可以识别的http方法,并且只缓存GET和HEAD方法的http请求,不缓存任何用户特有的数据;
vcl_fetch
vcl_fetch根据服务器端的响应做出缓存的策略,在任何的VCL状态引擎中返回的PASS操作都由vcl_fetch进行后续的处理,vcl_fetch中有很多内置的变量比如最常见的用于定义某对象缓存时长的beresp.ttl变量
注:默认的vcl_fetch放弃了缓存任何使用了Set-Cookie首部的响应
vcl_pipe
此函数在进入pipe模式的时候被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不改变的内容返回客户,知道这个链接被关闭
vcl_pass
将请求直接传递到后端主机,后端主机在应答数据后将应答数据发送给客户端,但不会进行缓存,所以在当前这种链接的情况下每次返回的都是最新的内容
vcl_hit
如果在执行完成lookup之后,在缓存中找到了请求的内容,那么会自动调用这个函数
lookup
在缓存中查找是否有请求的对象,并且根据结果把控制权交给vcl_hit(有结果)或者vcl_miss(没结果)
vcl_miss
执行lookup之后,如果没有在缓存中找到请求的对象,就调用这个函数,这个函数可以判断是否需要从后端服务器获取内容
vcl_deliver
如果lookup在缓存中找到的请求的对象,在将缓存的内容返回给客户端的时候会调用这个函数
七、varnish的状态引擎流程图:
八、varnish简易的内部处理流程:
九、varnish常见的环境变量:
变量名称 |
变量的意义 |
.host |
后端服务器的主机名或者IP地址 |
.port |
后端服务器的服务名称或者端口号 |
client.ip |
客户端的IP地址 |
srever.hostname |
服务器的主机名 |
server.ip |
服务器端的IP地址 |
req.request |
http请求的类型,如GET/HEAD/POST等 |
req.proto |
客户端发起的http协议的版本 |
req.http.header |
请求重启的次数 |
beresp.request |
后端服务器请求的类型,如get/head/post等 |
beresp.url |
请求的url地址 |
beresp.proto |
发起请求的http协议的版本 |
beresp.ttl |
最大缓存时长,以秒为单位 |
obj.status |
返回内容的请求的http状态码,如200、500、404、403等; |
性感的开源软件Varnish-基础知识篇