1.先解释varnish是什么?[摘]
Varnish 是一款高性能开源的Http加速器(其实是反向代理)。
工作流程:与服务器软件类似,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
1.vcl_recv,首先接收请求,判断是否要进一步处理,还是直接转发给后端(pass)等。 此过程中可以使用和请求相关的变量,例如客户端请求的url,ip,user-agent,cookie等,此过程中可以把不需缓存的地址,通过判断(相等、不相等、正则匹配等方法)转给后端,例如gif/png/jpg/css/js等静态文件;
2.vcl_fetch,当从后端服务器获取内容后会进入此阶段,除了可以使用客户端的请求变量,还可以使用从后端获取的信息(bersp),如后端返回的头信息,设置此信息的缓存时间TTL等;
3.vcl_miss 缓存未命中时中要做的处理
4.vcl_hit 缓存命中后做的处理
5.vcl_delever 发送给客户端前的处理
6.vcl_pass 交给后端服务器
7.vcl_hash 设置缓存的键值key
首次请求时过程如下:
recv->hash->miss->fetch->deliver
缓存后再次请求:
recv->hash->hit->deliver(fetch的过程没了,这就是我们要做的,把要缓存的页面保存下来)
直接交给后端pass的情况:
recv->hash->pass->fetch->deliver(直接从后端获取数据后发送给客户端,此时Varnish相当于一个中转站,只负责转发)
*详细请求过程可以参考./bin/varnishlog中的输出日志
2.为什么要进行varnish分流?
Varnish makes websites fly!
可以把整个网页内容缓存到内存(或文件)中,并设置不同类型的页面缓存不同时间(TTL),同时提供缓存的更新(purge)。
此外还可以设置多个后端服务器,支持后端服务器的健康检查,Header甚至url地址的重置修改,以及ESI(Edge Side Includes)功能(与nginx的ssi类似)
3.如何安装和配置?
【摘自】http://www.wangnow.com/article/17-varnish-makes-websites-fly
一、安装
下载源文件http://www.varnish-cache.org/releases,或者选择相应的编译版本直接安装(如直接安装方式以下步骤可跳过)
$ tar zxf varnish-2.1.5.tar.gz
$ cd varnish-2.1.5/
#假设安装在/data/app/varnish下,详细安装设置查看帮助./configure --help
$ ./configure --prefix=/data/app/varnish
$ make
$ make install
注意,如果配置中提示一个或者其中几个警告信息的话,是没有安装对应的支持库
configure: WARNING: xsltproc not found – not building documentation
checking for rst2man... no
checking for rst2man.py... no
configure: WARNING: rst2man not found – not building man pages
checking for clock_gettime in -lrt... yes
checking for dlopen in -ldl... yes
checking for library containing initscr... no
configure: WARNING: curses not found; some tools will not be built
直接安装对应扩展库即可,否则varnishhist varnishtop varnishsizes varnishstat这些工具不会安装
sudo apt-get install xsltproc rst2man libncurses5-dev
二、配置
首先,修改Varnish的配置文件default.vcl,默认在安装目录的./etc/varnish/下,当然,在哪并不重要,可以在启动服务的时候指定配置文件(关键你要记得位置……)
#开头的是注释标记,.host表示的是后端服务器的地址或者域名,.port其对应的端口号(这里为了方便测试,Varnish和web服务器都位于一台机子上,我们用Varnish监听8080端口,暂时先不修改原web服务器的80端口)
backend default {
.host = "127.0.0.1";
.port = "80";
}
运行Varnish
sudo ./sbin/varnishd -f /data/app/varnish/etc/varnish/default.vcl -s malloc,32M\
-T 127.0.0.1:2000 -a 0.0.0.0:8080 -F
验证页面有Varnish的标准
直接访问localhost:8080即可看到经过Varnish输出的页面了!
通过Firebug或者curl -I查看http头信息:
Server: nginx
Content-Type: text/html
Last-Modified: Sat, 09 Apr 2011 15:51:38 GMT
Content-Encoding: gzip
Content-Length: 134
Date: Thu, 05 May 2011 14:15:59 GMT
X-Varnish: 1047954835 1047954830
Age: 7
Via: 1.1 varnish
Connection: keep-alive
首先可以看Age字段,如果是大于0的话,说明是从缓存命中的。其次查看X-Varnish字段,如果是两个数字例如X-Varnish: 1668515406 1668515405
代表的是Varnish两次请求id(req.xid):一个为发起请求的id,另外一个是获取缓存的id,而缓存未命中或者pass到后端的情况都是一个数值(当然你可以在deliver过程中修改这些头信息或者直接隐藏掉)
Notice:
如果后端程序设置了类似这样的头信息Cache-Control: max-age=300
会重置默认的缓存时间TTL,当然你可以在配置文件中重置这个时间
4.如何测试varnish数据准确性?
(1)分流code一般记录在查审
/usr/local/varnish/etc/varnish/default.vcl
(2)一定优先保证测试数据是正确的
(3)访问页面查看请求url日志记录
sudo tail -f /var/log/messages
(4)所有准备都做好清除Varnish后重新访问页面
sudo /etc/init.d/varnish restart