1、varnish 概述
varnish是一款高性能且开源的方向代理服务器和HTTP加速器,它的开发者poul-Henning kamp FreeBSD 核心的开发人员之一。varnish采用全新的软件体系机构,和现在的硬件体系配合紧密,
varnish是一个轻量级的cache和反向代理软件。先进的设计理念和成熟的设计框架式varnish的主要特点。现在的varnish总共代码量不大,虽然功能在不断改进,但是还需要继续丰富加强
2、varnish的特点:
1、基于内存进行缓存,重启后数据将消失。
2、利用虚拟内存方式,I\O性能好。
3、支持设置0~60秒的精确缓存时间。
4、VCL配置管理比较灵活。
5、具有强大的管理功能,例如top、stat、admin、list 等。
6、状态机设计巧妙、结构清晰。
7、利用二叉堆管理缓存文件,可达到积极删除目的。
3、开始安装varnish
varnish的安装非常简单,下面逐步介绍;
3.1、安装前的准备
vanish 安装环境如下表所示:
hostname | Operating System | IP Address |
Varnish-Server | CentOS Releas6.4 | 192.168.1.8 |
Web-Server | CentOS Releas6.4 | 192.168.1.6 |
3.2、接着,建立Vanish用于以及用户组,并且创建Varnish缓存目录和日志目录
# useradd -s /sbin/nologin varnish # mkdir /data/vanish/cache -pv # mkdir /data/vanish/log # chown -R varnish:varnish /data/vanish/cache/ # chown -R varnish:varnish /data/vanish/log/
3.3、获取Varnish软件
Varnish的官方网址为 https://www.varnish-cache.org/ ,这里有varnish的最新说明文档及版本升级记录,在此网站中可以找到varnish在SourceForge中的下载链接。目前,The current stable release of Varnish Cache 3 is 3.0.5,下载完成后包名为varnish-3.0.5.tar.gz,这里以此版本为例,进行安装配置。
3.4、 安装pcre 官方站点: http://www.pcre.org/ 下载完成的包名为 pcre-8.35.zip
如果没有安装pcre,在编译varnish-3.0.5.tar.gz 以上版本时,会提示找不到pcre库,而pcre库是为了兼容正则表达式,所以必须安装pcre库。下面是pcre的安装过程:
如果安装pcre出现如下错误时:
# ./configure --prefix=/usr/local/pcre/ checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... configure: error: newly created file is older than distributed files! Check your system clock
按提示应该是文件时间问题,新创建的时间既然比现在的文件时间晚,系统时间问题
解决办法:
hwclock --set --date="月/日/年 小时:分钟:秒钟" hwclock --hctosys # hwclock --set --date "04/09/2014 00:00:00" # hwclock --hctosys
hwclock --hctosys是让上面设置的硬件时间同系统时间同步
# unzip pcre-8.35.zip # cd pcre-8.35 # ./configure --prefix=/usr/local/pcre/ # make && make install
3.5、安装Varnish
这里讲Varnish 安装到/usr/loca 目录下,操作如下:
# tar xvf varnish-3.0.5.tar.gz # cd varnish-3.0.5 # export PKG_CONFIG PATH=/usr/local/pcre/lib/pkgconfig # ./configure --prefix=/usr/local/varnish \ --enable-dependency-trackin \ --enable-debugging-symbols \ --enable-developer-warnings # cp redhat/varnish.initrc /etc/init.d/vanish # cp redhat/varnish.sysconfig /etc/sysconfig/varnish
其中,"PKG_CONFIG_PATH" 是指定Varnish查找pcre库的路径。如果pcre安装在其它路径下,在这里指定相应路径即可,varnish默认查找pcre库的路径为/usr/local/lib/pkgconfig。最后两步操作时复制一些Varnish守护进程的初始化脚本文件,这些脚本文件用户varnish的启动,关闭等方面。
至此,varnish安装完毕了!
4、配置Varnish
4.1、 VCL 使用说明
VCL 即为 varnish configuration Language,用来定义varnish的存取策略。VCL 语法比较简单,跟C和perl比较相似,可以使用指定运算符"="、比较运算符"="、逻辑运算符"!&&!!"等形式;还支持正则表达式和用"~"进行ACL匹配运算;还可以使用"set"这样的关键字指定变量。
VCL内置函数
(1)
用于接收和处理请求。当请求到达并被成功接收后调用,通过判断请求的数据来决定如何处理请求
pass:表示进入pass模式,把请求控制权交给val_pass函数。
pipe:表示进入pipe模式,把请求控制权交个vcl_pipe函数。
error code[reason]:表示返回"code"给客户端,并放弃处理该请求。"code"是错误标识,例如200和405等。"reason"是错误提示信息。
(2)vcl_pipe函数
此函数在进入pipe模式时被调用,用户将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个链接被关闭。
此函数一般以如下几个关键字结束。
erro code[reason]
pipe
(3) vcl_pass 函数
此函数在进入pass模式时被调用,用户将请求直接传递至后端主机。后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存,在当前链接下每次都返回最新的内容。
此函数一般以如下几个关键字结束。
error code [reason]
pass
(4)lookup
表示在缓存中查找被请求的对象,并且根据查找的结果把控制权交给函数vcl_hit 或函数vcl_miss
(5)vcl_hit 函数
在执行lookip指令后,在缓存中找到请求的内容后将自动调用该函数。此函数一般以如下几个关键字结束。
deliver:表示将找到的内容发送给客户端,并把控制权交个函数vcl_deliver
error code[reason]
pass
(6) vcl_miss 函数
在执行lookup指令后,在缓存中没有找到请求的内容时自动调用该方法。此函数可用于判断是否需要从后端服务器获取内容
此函数一般如下几个关键字结束。
fetch:表示从后端获取请求的内容,并把控制权交个vcl_fetch函数
error code [reason]
pass
(7)vcl_fetch函数
在后端主机更新缓存并且获取内容后调用该方法,接着通过判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。
此函数一般以如下几个关键字结束。
error code [reason]
pass
deliver
(8)vcl_deliver函数
将在缓存中找到请求的内容发送给客户端前调用此方法。
此函数一般以如下几个关键字结束。
error code [reason]
deliver
(9)vcl_timeout 函数
在缓存内同到期前吊桶此函数。
此函数一般以如下几个关键字结束。
discard:表示从缓存中清除该内同
fetch。
(10)vcl_discard函数
在缓存内容到期后或缓存空间不够时,自动吊桶该函数。
此函数一般如下几个关键字结束。
keep:表示将内容继续保存在缓存中。
discard。
4.2、VCL处理流程图
通过以上对VCL函数的介绍,其实你们应该都发现了,其实每个函数之间都是相互关联的。 如下如所示:Varnish处理HTTP请求的运行流程图
Varnish处理HTTP请求的过程大致分为如下几个步骤;
(1)Receive状态。也就是请求处理的入口状态,根据VCL规则判断该请求应该pass或者pipe,还是进入lookup(本地查询)
(2)Lookup状态。进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入Miss状态。
(3)Pass状态。在此状态下,会进入后端请求,即进入fetch状态。
(4)Fetch状态。在fetch状态下,对请求进行后端获取,发送请求,获得数据,并进行本地存储。
(5)Deliver状态。将获取到的数据发送给客户端,然后完成本次请求。
4.3、内置公用变量
VCL内置的公用变量可以在不同的VCL函数中。下面根据这些公用变量使用的不同阶段依次介绍。当请求到达后,可以使用的公用变量如下表:
公用变量名称 | 含义 |
rcq.backend | 指定对应后端主机 |
server.ip | 表示服务器IP |
client.ip | 表示客户端IP |
req.request | 指定请求的类型,例如GET、HEAD和POST等 |
req.url | 指定请求的地址 |
req.proto | 表示客户端发起请求的HTTP协议版本 |
req.http.header | 表示对应请求中的HTTP头部信息 |
req.restarts | 表示请求重启的次数,默认最大值为4 |
Varnish 在向后端主机请求时,可以使用的公用变量如下表:
公用变量名称 | 含义 |
beresp.request | 指定请求的类型,例如GET或HEAD等 |
beresp.url | 指定请求的地址 |
beresp.proto | 表示客户端发起请求中的HTTP协议版本 |
beresp.http.header | 表示对应请求中的HTTP头部信息 |
beresp.ttl | 表示缓存的生存周期,也就是cache保留多长时间单位是秒 |
从cache或后端主机获取内容后,可以使用的公用变量如下表所示:
公用变量名称 | 含义 |
obj.status | 表示返回内容的请求状态码,例如200、302、504等 |
obj.cacheable | 表示返回的内容是否可以缓存,也就是说,如果HTTP返回的是200、203、300、301、302、404或410等,并且有非0的生存期,则可以缓存 |
obj.valid | 表示是否是有效的HTTP应答 |
obj.response | 表示返回内容的请求状态信息 |
obj.proto | 表示返回内容的HTTP协议版本 |
obj.ttl | 表示返回内容的生存周期,也就是缓存时间,单位是秒 |
obj.lastuse | 表示返回上一次请求到现在的间隔时间,单位是秒 |
对客户端应答时,可以使用的公用变量,如下表所示:
公用变量名称 | 含义 |
resp.status | 表示返回客户端的HTTP状态代码 |
resp.proto | 表示返回客户端的HTTP协议版本 |
resp.http.header | 表示返回客户端的HTTP头部信息 |
resp.response | 表示返回客户端的HTTP状态信息 |