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-ServerCentOS 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_admin

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状态信息