1、Varnish简介
Varnish是一款高性能且开源的反向代理服务器(Reverse Proxy Server),挪威最大的线上报纸Verdens Gang使用3台Varnish代替了原本的12台Squid, 性能比以前更好。Varnish的作者Poul-Henning Kamp是FreeBSD核心的开发人员之一,他认为现在的电脑比起1975年已经复杂许多。在那个时代,存储媒介只有两种:记忆体与硬盘。但现在电脑系统的记忆体除了主记忆体外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此squid cache自行处理物件替换的架构不可能得知这些情況而做到最佳化,但作业系统可以得知这些情況,所以有关这部份的工作交给作业系统处理,这就是Varnish Cache的设计架构。
一般來说,使用Varnish代替Squid的理由有三点:
1.1、Varnish采用了“Visual Page Cache”技术,在记忆体的利用上,Varnish比Squid更具有优势,它避免了Squid频繁在记忆体、硬盘中交换文件,性能比Squid还高。
1.2、Varnish的稳定性高,进行相同工作的Squid服务器发生故障的几率似乎比Varnish高。
1.3、通过Varnish管理端口,可以使用正则表达式、批量地清除部分缓存,这一点是Squid不能具备的。
2、安装及启用
2.1、安装准备
安装依赖包
# yum install automake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig -y
下载安装包
# wget http://repo.varnish-cache.org/source/varnish-2.1.5.tar.gz
2.2、安装varnish
# tar xvf varnish-2.1.5.tar.gz
# cd varnish-2.1.5
# ./autogen.sh //配置时会检查软件的依耐关系是否满足
# ./configure
# make && make install
2.3、启动varnish
# varnishd -f /usr/local/etc/varnish/default.vcl -a 0.0.0.0:8080 -s malloc,1G -T 127.0.0.1:2022
参数含义:
-f 指定varnishd使用的配置文件
-s 配置varnish使用的存储类型和存储容量,存储类型分为目录文件或内存,默认使用/tmp目录文件存储。
-a HTTP监听地址与端口。
-T Telnet监听的地址与端口,用于执行varnish的一些管理命令。
所有的参数及含义可以通过“# varnishd --version”命令查看。
以上指令的含义为:varnishd使用/usr/local/etc/varnish/default.vcl中的配置参数,监听所有发往本机8080端口的HTTP请求,将访问结果缓存在内容中最大存储量为1G,varnish指令可以通过2022端口发送执行。
2.4、监测
查看日志
# varnishlog
查看连接数与命中率等
# varnishstat
开启日志
# varnishncsa -w /var/log/varnish.log &
3、default.vcl配置说明
vcl_recv
有请求到达后成功接收并分析时被调用,一般以以下几个关键字结束。
error code [reason] 返回code给客户端,并放弃处理该请求
pass 进入pass模式,把控制权交给vcl_pass
pipe 进入pipe模式,把控制权交给vcl_pipe
lookup 在缓存里查找被请求的对象,根据查找结果把控制权交给vcl_hit或vcl_miss
vcl_pipe
进入pipe模式时被调用。请求被直接发送到backend,后端和客户端之间的后继数据不进行处理,只是简单传递,直到一方关闭连接。一般以以下几个关键字结束。
error code [reason]
pipe
vcl_pass
进入pass模式时被调用。请求被送到后端,后端应答数据送给客户端,但不进入缓存。同一连接的后继请求正常处理。一般以以下几个关键字结束。
error code [reason]
pass
vcl_hash
目前不使用
vcl_hit
在lookup以后如果在cache中找到请求的内容事调用。一般以以下几个关键字结束。
error code [reason]
pass
deliver 将找到的内容发送给客户端,把控制权交给vcl_deliver.
vcl_miss
lookup后但没有找到缓存内容时调用,可以用于判断是否需要从后端服务器取内容。一般以以下几个关键字结束。
error code [reason]
pass
fetch 从后端取得请求的内容,把控制权交给vcl_fetch.
vcl_fetch
从后端取得内容后调用。一般以以下几个关键字结束。
error code [reason]
pass
insert 将取到的内容插入缓存,然后发送给客户端,把控制权交给vcl_deliver
vcl_deliver
缓存内容发动给客户端前调用。一般以以下几个关键字结束。
error code [reason]
deliver 内容发送给客户端
vcl_timeout
在缓存内容到期前调用。一般以以下几个关键字结束。
fetch 从后端取得该内容
discard 丢弃该内容
vcl_discard
由于到期或者空间不足而丢弃缓存内容时调用。一般以以下几个关键字结束。
discard 丢弃
keep 继续保留在缓存里
如果这些内置例程没有被定义,则执行缺省动作
一些内置的变量
now 当前时间,标准时间点(1970)到现在的秒数
backend.host 后端的IP或主机名
backend.port 后端的服务名或端口
请求到达后有效的变量
client.ip 客户端IP
server.ip 服务端IP
req.request 请求类型,比如GET或者HEAD或者POST
req.url 请求的URL
req.proto 请求的HTTP版本号
req.backend 请求对应的后端
req.http.header 对应的HTTP头
往后段的请求时有效的变量
bereq.request 比如GET或HEAD
bereq.url URL
bereq.proto 协议版本
bereq.http.header HTTP头
从cache或后端取到内容后有效的变量
obj.proto HTTP协议版本
obj.status HTTP状态代码
obj.response HTTP状态信息
obj.valid 是否有效的HTTP应答
obj.cacheable 是否可以缓存的内容,也就是说如果HTTP返回是200、203、300、301、302、404、410并且有非0的生存期,则为可缓存
obj.ttl 生存期,秒
obj.lastuse 上一次请求到现在间隔秒数
对客户端应答时有效的变量
resp.proto response的HTTP版本
resp.status 回给客户端的HTTP状态代码
resp.response 回给客户端的HTTP状态信息
resp.http.header HTTP头
四、参考阅读
1、《Varnish-2.1.1服务器安装配置文档[原创二版]》