1:varnish的安装:
#rpm --nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el5/noarch/varnish-release-3.0-1.noarch.rpm
其中:
--nosignature :想要略过数字证书的检查时,可以使用这个参数。
-i:install的意思。
#rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
其中:
-Uvh:后面接的软件如果没有安装过,则系统将予以直接安装;若后面的软件有安装过且是旧版本的,则系统自动更新到新版。
#yum install varnish
安装varnish后有两个重要的配置文件分别为:
/etc/sysconfig/varnish
varnish的启动调用环境参数脚本
/etc/varnish/default.vcl
varnish的默认配置文件
2:varnish指定其启动参数:
其中如下几个重要参数:
VARNISH_VCL_CONF=/etc/varnish/default.vcl
指定varnish的配置文件的位置
VARNISH_LISTEN_PORT=80
指定varnish服务监听的端口
VARNISH_ADMIN_LISTEN_ADDRESS=0.0.0.0
指定varnish的管理IP(telent时)
VARNISH_ADMIN_LISTEN_PORT=6082
指定varnish的telnet端口
VARNISH_SECRET_FILE=/etc/varnish/secret
共享密钥文件
VARNISH_MIN_THREADS=1
指定启动的最小的线程数
VARNISH_MAX_THREADS=2500
指定启动的最大的线程数
VARNISH_THREAD_TIMEOUT=30
指定varnish的线程超时为30s
##需说明:在varnish2.0版本以后,不能讲最小启动的线程数设定过大,如果设定过大,会导致Varnish运行异常缓慢。
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin
指定varnish的缓存文件所在的位置
VARNISH_STORAGE_SIZE=2500M
指定缓存文件的大小
VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}"
其中varnish的存储方式有file和malloc两种方式
1)Malloc 通过malloc获取内存。
2)Mmap file 创建大文件,通过二分法分段映射成1G以内的大块。
VARNISH_TTL=86400
指定默认的TTL值,超过这个值得数据包将被丢弃
##其中只为参考值,根据环境修改。
3:varnish的配置文件的讲解:
#vi /etc/varnish/default.vcl
backend nginxd01 {
     .host = "192.168.2.96";
     .probe = {
         .url = "/control/HappyIndex";
         .interval = 10s;
         .window = 5;
         .threshold = 3;
         }
     .first_byte_timeout = 15s;
}
##其中:
backend:定义一个名称为nginxd01的后端主机
.host:指定后端主机的IP地址或域名
.probe:定义判断后端主机的服务是否正常访问
.first_byte_timeout:指定接收第一个字节的timeout时间

backend nginxd02 {
     .host = "192.168.2.82";
     .probe = {
        .url = "/control/HappyIndex";
        .interval = 10s;
        .timeout = 1s;
        .window = 5;
        .threshold = 3;
        }
     .first_byte_timeout = 15s;
}
##定义了另一台后端主机
director web random {
     { .backend = nginxd01;
       .weight = 2;
     }
     { .backend = nginxd02;
       .weihet = 2;
     }
}
##其中:
director:定义一个名称为web的负载均衡器;也就是有nginxd01,nginxd02两台后端服务器随机分担请求。
.weight:指定两台后端服务器的权值。权值高的处理请求的几率就高些。

acl purge {
     "localhost";
     "127.0.0.1";
     "192.168.2.0"/24;
}
##其中:
这里设定清除缓存的规则,Varnish允许localhost,127.0.0.1和192.168.2.0/24三个来源IP通过purge的方法清除缓存。

sub vcl_recv {
    if (req.restarts == 0) {
       set req.http.Cdn-Src-Ip = client.ip;
    if (req.http.x-forwarded-for) {
       set req.http.X-Forwarded-For + ", "+ client.ip;
    } else {
       set req.http.X-Forwarded-For = client.ip;
    }
   }
##其中:
vcl_recv:VCL的内置函数,用于接收和处理请求。当请求到达并被成功接收后被调用,通过判断请求的数据来决定如何处理请求。
req.restarts:表示请求重启的次数,默认最大值为4
client.ip:表示客户端IP
    if (req.request == "PURGE") {
        if (!client.ip ~ purge) {
            error 405 "Not allowed.";
        }
        return(lookup);
    }
    set req.backend = web;
##其中:
req.request:指定请求的类型,例如:GET,HEAD,POST等等
lookup:表示在缓存中查找被请求的对象,并且根据查找的结果把控制权交给函数vcl_hit或vcl_miss函数。
   if (req.request != "GET" && req.request != "HEAD") {
          return(pipe);
      }
      if (req.request == "GET" && req.url ~ "\.(txt|html|swf|flv|tiff|ico|css|gif|jpg|jpeg|png|bmp)$") {
          unset req.http.cookie;
      }
      if (req.http.Authorization || req.http.Cookie) {
          return(pipe);
      }
      else {
          return(lookup);
      }
}
##其中:
pipe:表示进入pipe模式,把请求控制权交给vcl_pipe函数
vcl_pipe:此函数在进入pipe模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个链接关闭。
req.url:指定请求的地址
unset req.http.cookie: 清除url中有jpg|png|gif等文件的cookie

sub vcl_hit {
       if (req.request == "PURGE") {
               set obj.ttl = 0s;
               error 200 "Purged.";
       }
}

sub vcl_miss {
       if (req.request == "PURGE") {
               error 404 "Not in cache.";
       }
}
##其中:
vcl_hit:在执行lookup指令后,在缓存中找到请求的内容后将自动调用该函数。
obj.ttl:表示返回内容的生存周期,也就是缓存时间,单位是秒。
如果请求的类型是purge方法,Varnishd会将此请求的缓存周期设置为0,也就是使这个url的缓存失效,从而达到刷新Varnish缓存的目的。
vcl_miss:在执行lookup指令后,在缓存中没有找到请求的内容时自动条用该方法。此函数可以判断是否需要从后端主机获取内容。

4:varnish的启动:
/etc/init.d/varnish start
/etc/init.d/varnishncsa start
#ps -ef|grep varnish
root     23683     1  0 21:11 ?        00:00:00 /usr/sbin/varnishd -P /var/run/varnish.pid -a :80 -f /etc/varnish/default.vcl -T 0.0.0.0:6082 -t 86400 -w 1,2000,30 -u varnish -g varnish -S /etc/varnish/secret -s file,/var/lib/varnish/varnish_storage.bin,2500M
varnish  23687 23683  0 21:11 ?        00:00:00 /usr/sbin/varnishd -P /var/run/varnish.pid -a :80 -f /etc/varnish/default.vcl -T 0.0.0.0:6082 -t 86400 -w 1,2000,30 -u varnish -g varnish -S /etc/varnish/secret -s file,/var/lib/varnish/varnish_storage.bin,2500M
root     23705     1  0 21:12 ?        00:00:00 /usr/bin/varnishncsa -a -w /var/log/varnish/varnishncsa.log -D -P /var/run/varnishncsa.pid