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