站点加速一定要用到缓存服务器,而目前开源的缓存服务器有Squid,Varnish与Nginx(nginx第三方模块)。各款服务器都有自己的优劣点,没有坏的技术,只有不正确的适用场景。对于打算自建CDN的童鞋,可以都尝试用用,然后选择出最适合自己的。本文介绍varnish环境搭建及基本的VCL(varnish配置语言)语法。
-a 对后端HTTP服务器的监听接口
一、varnish安装
https://www.varnish-cache.org/releases
1. 安装依赖包
2. 安装varnishsudo apt-get install autotools-dev automake1.9 libtool autoconf libncurses-dev xsltproc groff-base libpcre3-dev
curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -
echo "deb http://repo.varnish-cache.org/debian/ wheezy varnish-3.0" >> /etc/apt/sources.list
apt-get update
apt-get install varnish
3. varnish重要文件路径
(1)配置文件
/etc/varnish/
(2)命令工具
1)varnishd 守护进程
2)varnishadm varnish实例管理接口,可以动态的删除缓存,重新加载配置文件等
3)varnishlog 日志查看
4)varnishncsa 以ncsa格式显示日志
5)varnishtop 读取共享内存的日志
6)varnishstat 统计工具, 包含很多计数器,请求丢失率,命中率,存储信息,创建线程,删除对象等,几乎所有的操作。通过跟踪这些计数器,可以很好的了解varnish运行状态
7)varnishhist
8)varnishsizes
9)varnishtest 测试工具
10)varnishreplay http流量重放工具
二、 varnish启动,以varnish+lighttpd为例
1. 修改lighttpd(后端服务器)的端口
vim /etc/lighttpd/lighttpd.conf
server.port = 8032
service lighttpd start
2. 修改varnish配置文件
vim /etc/varnish/default.vcl
backend default {
.host = "127.0.0.1";
.port = "8032";
}
3.启动varnish
仅介绍基础启动所需参数
pkill varnishd
varnishd -f /etc/varnish/default.vcl -s file,/home/tanjiti/varnish_storage.bin,1G -T 127.0.0.1:2000 -a 0.0.0.0:80
-s 设置缓存存放地方,可以放在内存中(-s malloc,1G) 也可以放在文件中
-f vcl配置文件,vcl的逻辑处理都依赖与vcl配置文件,可以在守护进程varnishd中指定vcl文件,也可以用varnishadm
来加载指定文件
第一步:将VCL文件放到对应的服务器上
第二步:进入varnishadm管理界面
第三步:
vcl.load <configname> <filename>
vcl.use <configname>
-T 管理端口
三、VCL执行过程

以下是上图涉及到vcl关键子函数,varnish在处理HTTP请求的各个阶段会回调这些函数进行处理。
1. VCL关键子函数
a.vcl_recv
用于接收和处理请求。当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求。例如如何响应、怎么响应、使用哪个后端服务器等。
返回值:
error code [reason] 返回规定的代码给客户端,并终止请求。 CODE是HTTP响应码,例如200或405等;reason是错误提示信息
pass 表示进入pass模式,控制权交给vcl_pass
pipe 表示进入pipe模式,控制权交给vcl_pipe
lookup 表示进入lookup模式,在cache中查找请求目标,控制权传递给vcl_hit或vcl_miss
b.vcl_pipe
此函数在进入 pipe 模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个连接被关闭。
返回值:
errorcode
pipe
c.vcl_pass
此函数在进入 pass 模式时被调用,用于将请求直接传递至后端主机。后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存,在当前连接下每次都返回最新的内容。
返回值:
errorcode
pass
restart 重新启动流程,增加启动次数,如果重新启动次数高于max_restarts发出一个错误警告
d.vcl_hash
设置缓存的键值key,当您想把一个数据添加到 hash 上时,调用此函数。
返回值:
hash
e.vcl_hit
在执行 lookup 指令后,在缓存中找到请求的内容后将自动调用该函数。
返回值:
error code
pass
deliver 表示将找到的内容发送给客户端,并把控制权交给函数 vcl_deliver
restart
f.vcl_miss
在执行 lookup 指令后,在缓存中没有找到请求的内容时自动调用该方法。此函数可用于判断是否需要从后端服务器获取内容。
返回值:
error code
pass
fetch 表示从后端获取请求的内容,并把控制权交给 vcl_fetch 函数。
g.vcl_fetch
在后端主机更新缓存并且获取内容后调用该方法,接着,通过判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。
返回值:
error code
pass
deliver
esi
restart
h.vcl_deliver
将在缓存中找到请求的内容发送给客户端前调用此方法
返回值:
error code
pass
deliver
i.vcl_error
出现错误时调用此函数
返回值:
deliver
restart
我们可以看出大概有4种处理流程
(1). 处于PIPE状态,HTTP请求直接交给后端服务器处理
vcl_recv -> vcl_pipe
(2). 处于PASS状态,Varnish相当于一个只负责转发的中转站
vcl_recv -> vcl_pass -> vcl_fetch -> vcl_deliver
3. varnish 缓存
(3)初次请求,miss缓存
vcl_recv -> vcl_hash -> vcl_miss -> vcl_fetch -> vcl_deliver
(4)再次请求,hit缓存
vcl_recv -> vcl_hash -> vcl_hit -> vcl_deliver
3. VCl操作符
= 赋值
~ 正则匹配
!逻辑非
&& 逻辑and
||逻辑or
== 相等
4. VCL内置函数
regsub(str,regex,sub)
regsuball(str,regex,sub)
purge_url(regex)
5. 自定义子函数
sub subname{
}
call subname;
对于商用云级应用,CloudFlare,安全宝都选择了Nginx服务器,其原因有很多,有性能方面的例如varnish对大并发的处理能力有限,简单的测试下来,varnish能支持3w左右并发,而nginx能支持到5w左右,有功能方面的,varnish对动态网页的缓存有限。
参考:
http://www.ibm.com/developerworks/cn/opensource/os-cn-varnish-intro/
http://my.oschina.net/u/572653/blog/178201