varnish是一款高性能的开源HTTP加速器,现在很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源暂用更少。相信在反向代理,web加速方面,varnish已经有足够能力代替squid。好了,下面就开始我们的varnish之旅吧!需要说明的是在进行下面的实验时我们主机上已经安装好了web服务器,并且能正常运行了。
首先下载所需的软件包我是在http://www.varnish-software.com/release里面下载的。在安装软件包之前首先看看主机上的
automake
autoconf
libtool
ncurses-devel
libxslt
groff
pcre-devel
pkgconfig软件包是否已经安装 如果没有那么就要首先安装,我直接用yum安装的(关于yum源的配置请看我的另外的那篇文章)
#yum install -y automake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig
接下来将你下载的软件包解压到一个目录下
#tar zxvf varnish-2.1.3.tar.gz然后进入解压后的目录中
#cd varnish-2.1.3
在配置前可以检查一下软件的依赖关系是否满足,避免不必要的麻烦
#sh autogen.sh
#sh configure
#make
在进行安装前可以进行一下自动测试,这个过程要花费一段时间
[root@db varnishtest]# cd bin/varnishtest/ && ./varnishtest tests/* .vtc我的测试结果如下
如果您发现有一两个失败的时候,请不用担心,某些测试项目对时间比较敏感如果出现很多错误,尤其是 b00000.vtc 测试也失败话,应该是发生了某些严重的错误,这是你就应该解决这些问题,然后再继续。
#make install
安装安成后我们的配置文件在 /usr/local/etc/varnish/default.vcl 下
好了接下来就开始我们的配置之旅吧。
首先将下面这些开始的注释去掉,并将8080改为80
# backend default {
# .host = "127.0.0.1";
# .port = "8080";
# }
backend default {
.host = "127.0.0.1";
.port = "80";
}
现在,这块配置定义了一个 varnish默认访问的后端服务器,当varnish 需要从后端
服务器获取内容的时候,它就会访问自己(127.0.0.1)的80端口。 Varnish 可以定义多个后端服务器而且您可以通过定义多个后端服务器达到负载均衡的目的。
现在我们完成了基本的 varnish 配置,我们可以在 8080 端口上启动 varnish,并做一些基本的测试。
下面我们启动varnish。
[root@db varnish]# varnishd -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:8080
会出现下面的内容说明启动成功了。
storage_malloc: max size 1024 MB.
Creating new SHMFILE
其中-f指定varnish的配置文件
–s 选项用来确定varnish使用的存储类型和存储容量
-T指定监听本地端口
-a 0.0.0.0:8080
用来制定 varnish 监听所有 IP 发给 8080 端口的 http 请求,如果在生产环境下,您应该让varnish监听80,这也是默认的。
我们在浏览器里输入http://192.168.0.131:8080/可以看到web程序正在运行。
为了让我们知道varnish到底做了什么,那么我们就来设置日志吧。
Varnish一个特别的优点就是它如何记录数据的。使用内存段代替普通的日志文件,当内存段使用完以后,又从头开始,覆盖最旧的记录。这样就可以非常快的记录数据,,并且不需要磁盘空间。 缺点就是您没有把数据写到磁盘上,可能会消失。在命令行执行varnishlog将会得到一下信息
这就说明varnish的主进程在正常运行。
如果你在浏览器里在访问一下会看到类似下面的内容:
我是在windows主机中访问的
第一列是任意的数,它用来定义请求,相同的号码代表相同的 HTTP传输。
第二列是日志标记,所有的日志都带有一个标记(tag),标记对应相对的操作。Rx表示varnish收到数据,Tx表示varnish发送数据。
第三列代表数据是从 c(client)还是 b(backend)传出或者传入的。
第四列是被记录的数据。使用varnishlog时有几个参数,可以让你能更方便的得到你想要的内容-b 只显示varnish和backend server 之间的日志
-c 只显示varnish和 client端的通信。
-i tag 只显示某个 tag,比如“varnishlog –i SessionOpen”将只显示新会话。
-I 通过正则表达式过滤数据,比如“varnishlog -c -i RxHeader -I Cookie”将
显示所有接到到来自客户端的包含 Cookie 单词的头信息。
-o 聚合日志请求 ID
如果varnish一切运行 OK,我们就可以把它调整到80端口上。
首先关闭varnish
[root@db ~]# pkill varnished
然后停止您的 web服务器,修改web服务器配置,把 web服务器修改成监听8080
端口,然后修改varnish 的default.vcl和改变默认的后端服务器端口为8080. 先重启web服务器然后重新启动varnish
Varnish 有一个很棒的配置系统,大部分其他的系统使用配置指令,让您打开或者关闭一些开关。Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language)在执行vcl时,varnish 就把VCL转换成二进制代码。
vcl_recv在请求的开始被调用,在接收、解析后,决定是否响应请求,怎么响应,使用哪个后台服务器,vcl_recv中只有请求的目标,req is available。
vcl_fetch 在一个文件成功从后台获取后被调用,通常他的任务就是改变 response headers,触发ESI进程,在请求失败的时候轮询其他服务器。
在 vcl_fetch 仍然包含的请求有object,req,available,他们通常是backend response,beresp。beresp 将会包含后端服务器的HTTP 的头信息
actions 主要有以下动作 :
pass 当一个请求被pass后,这个请求将通过varnish转发到后端服务器,但是它不会被缓存。
lookup 当一个请求在vcl_recv中被lookup后,varnish将从缓存中提取数据,如果缓存中没有数据,将被设置为pass,不能在 vcl_fetch中设置lookup。
deliver 请求的目标被缓存,然后发送给客户端
在VCL 中,有3 个重要的数据结构
request 从客户端进来
responses 从后端服务器过来
object 存储在cache 中
req 请求目标,当 varnish 接收到一个请求,这时 req object 就被创建了,你在vcl_recv中的大部分工作,都是在 req object上展开的。
beresp 后端服务器返回的目标,它包含返回的头信息,你在vcl_fetch中的大部分工作都是在beresp object上开展的。
obj 被 cache 的目标,只读的目标被保存于内存中,obj.ttl 的值可修改,其他的只能读。
VCL 支持以下运算,
= 赋值运算符 == 对比
~ 匹配,在ACL中和正则表达式中都可以
! 否定
&& 逻辑与
|| 逻辑或
在安装完varnish之后会自动安装一些工具,这些工具可以让你查看varnish正在做什么。
varnishtop -i rxurl 可以看到客户端请求的 url次数。
varnishtop -i txurl 可以看到请求后端服务器的url次数。
varnishtop -i Rxheader –I Accept-Encoding 可以看见接收到的头信息中有有多少次
包含Accept-Encoding。
varnishhist
varnishhist工具读取varnishd的共享内存段日志,生成一个连续更新的柱状图,显示最后 N 个请求的处理情况。这个 N 的值是终端的纵坐标的高度,横坐标代表的是对数,如果缓存命中就标记“|”,如果缓存没有命中就标记上“#”符号。
varnishsizes varnishsizes 和varnishhist相似,除了varnishsizes现实了对象的大小,取消了完成请求的时间。这样可以大概的观察您的服务对象有多大。
varnishstat
varnish 有很多计数器,我们计数丢失率,命中率,存储信息,创建线程,删除对象等,几乎所有的操作。Varnishstat将存储这些数值,在优化varnish的时候使用这个命令。
好了今天就先到这吧