varnish的介绍很多,这里就不做过多的说明,直接贴上我的安装及配置方法,希望会对大家有用,仅供参考


安装方法如下:

 wget -S http://repo.varnish-cache.org/source/varnish-3.0.2.tar.gz
 tar zxvf varnish-3.0.2.tar.gz
 cd varnish-3.0.2
 ./configure --prefix=/usr/local/varnish --enable-dependency-trackin --enable-debugging-symbols --enable-developer-warnings
 make
 make install
 varnish No package 'libpcre' found
 说是缺少 pcre。我安装nginx的时候用到了pcre 安装了的
 使用以下办法
 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig


backend www {
.host = "127.0.0.1";
.port = "80";
}
backend blog {
.host = "127.0.0.1";
.port = "80";
}

director webbeta round-robin {
{.backend=www;}
{.backend=blog;}
}

acl purge {
"127.0.0.1";
"localhost";
}

sub vcl_recv
{
       if (req.http.host ~ "^neirong.funshion.com")  #匹配域名跳转后台服务器
            { set req.backend = neirong; }
       if (req.http.host ~ "^game2.funshion.com")  #匹配域名跳转后台服务器
            { set req.backend = game2; }
       if (req.http.host ~ "^v.funshion.com")  #匹配域名跳转后台服务器
            { set req.backend = vfunshion; }
         else { error 404 "Unknown HostName!"; }
        if (req.request == "PURGE")    #不允许非访问控制列表内的IP清除varnish缓存
             { if (!client.ip ~ purge)
                 {
                  error 405 "Not Allowed.";
		   ##除以上的访问请求,从缓存中查找
                  return (lookup);
                 }
             }
#grace#
	set req.grace = 2m;
	if (req.request != "GET" && req.request != "HEAD") {
                if (req.request == "POST") {
                        return(pass);
                }
	}
	#Global Gzip#
	if (req.http.User-Agent ~ "MSIE\s+[1-6]") {
				remove req.http.Accept-Encoding;
	}

	#Gzip #
	if (req.http.Accept-Encoding){
	    if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|flv|jpeg)$"){
					remove req.http.Accept-Encoding;
	   }
	    if (req.http.Accept-Encoding ~ "(gzip|deflate)"){
		set req.http.Accept-Encoding = "gzip,deflate";
	   }
#	   if (req.url ~ "\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") {
#		unset beresp.http.set-cookie;
#		}
	}

	#X-forwarded#
        if (req.http.x-forwarded-for) {
            set req.http.X-Forwarded-For =
                req.http.X-Forwarded-For + ", " + client.ip;
        } else {
		set req.http.X-Forwarded-For = client.ip;
	}
	#x-forwarded END#

	if (req.http.cookie) {
	    unset req.http.cookie;
	}
                set req.backend = taoedu;
        return(lookup);
}
sub vcl_deliver
 {
       set resp.http.x-hits = obj.hits ;
       if (obj.hits > 0)
              { set resp.http.X-Cache = "HIT voilet_hit"; }
       else { set resp.http.X-Cache = "MISS voilet_miss"; }
  }

通过Varnish管理端口,使用正则表达式批量清除缓存
清除所有缓存
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge *$
清除image目录下所有缓存
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /image/
127.0.0.1:3500 为被清除缓存服务器地址 www.kangta.com 为被清除的域名 /static/image/tt.jsp 为被清除的url地址列表
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 purge “req.http.host ~ www.funshion.com$ && req.url ~ /static/image/tt.jsp”

#http请求处理过程
#1,receive请求入口状态,根据vcl判断pass还是lookup本地查询
#lookup,在hash表中查找数据,若找到则进入hit状态,否则进入fetch状态
#pass,选择后台,进入fetch状态
#fetch,对请求进行后端的获取,发送请求,获得数据,并进行本地存储
#deliver,将数据发送给客户端,进入done
#done,处理结束

Subroutine列表
vcl_recv
在请求开始时候被调用,在请求已经被接收到并且解析后调用目的就是决定是否处理这个请求,怎么处理,使用哪个后端vcl_recv以return结束,参数可以为如下关键字:
error code [reason]:返回错误码给客户端,丢弃请求
pass:转换到pass模式控制权最后会转移到vcl_pass
pipe:转换到pipe模式控制权最后会转移到vcl_pipe
lookup:在缓存中寻找请求对象控制权最后会转移到vcl_hit或者vcl_miss,决定于对象是否在缓存中
vcl_pipe
当进入pipe模式的时候被调用在这个模式中,请求会被转移到后端,后续的数据不管是从客户端还是后端来的都会以不变的方式传送,直到连接关闭为止vcl_pipe以return结束,参数可以为如下关键字:
error code [reason]:返回错误码给客户端,丢弃请求
pipe:以pipe模式执行
vcl_pass
当进入pass模式的时候会被调用在这个模式中,请求会被传送到后端,然后后端的响应会被传送回客户端,但是响应不会进入缓存中接下来通过相同客户端连接发起的请求会以普通的方式来处理vcl_pass以return结束,参数可以为如下关键字:
error code [reason]:返回错误码给客户端,丢弃请求
pass:以pass模式执行
restart:重新启动这个事务增加了重启计数如果重启的次数高于max_restarts,varnish会引起一个错误
vcl_hash
你如果把想把数据加入到hash中,那么调用hash_data()vcl_hash以return结束,参数可以为如下关键字:
hash:执行hash逻辑
vcl_hit
如果请求的对象在缓存中被找到了,那么在缓存查找结束后被调用vcl_hit以return结束,参数可以为如下关键字:
deliver:deliver缓存对象到客户端控制权最后会转移到vcl_deliver
error code [reason]:返回错误码给客户端,丢弃请求
pass:切换到pass模式控制权最后会转移到vcl_pass
restart:重新启动这个事务增加了重启计数如果重启的次数高于max_restarts,varnish会引起一个错误
vcl_miss
如果请求的对象在缓存中没有被找到,那么在缓存查找结束后被调用目的是为了决定是否去后端获取这个请求对象,并且要选择哪个后端vcl_miss以return结束,参数可以为如下关键字:
error code [reason]:返回错误码给客户端,丢弃请求
pass:切换到pass模式控制权最后会转移到vcl_pass
fetch:去后端获取请求对象控制权最后会转移到vcl_fetch
vcl_fetch
当一个对象被成功从后端获取的时候此方法会被调用vcl_fetch以return结束,参数可以为如下关键字:
deliver:可能把对象放入缓存中,然后再deliver到客户端控制权最后会转移到vcl_deliver
error code [reason]:返回错误码给客户端,丢弃请求
esi:以ESI形式来处理刚刚被获取到的对象
pass:切换到pass模式控制权最后会转移到vcl_pass
restart:重新启动这个事务增加了重启计数如果重启的次数高于max_restarts,varnish会引起一个错误
vcl_deliver
当一个缓存的对象被deliver到客户端的时候,此方法会被调用vcl_deliver以return结束,参数可以为如下关键字:
deliver:发送对象到客户端
error code [reason]:返回错误码给客户端,丢弃请求
restart:重新启动这个事务,增加重启计数如果重启的次数高于max_restarts,varnish会引起一个错误
vcl_error
当遇见一个错误的时候会被调用,错误可能是跟后端有关系或者内部错误vcl_error以return结束,参数可以为如下关键字:
deliver:发送对象到客户端
restart:重新启动这个事务,增加重启计数如果重启的次数高于max_restarts,varnish会引起一个错误

重要变量

subroutine不带参数,一般通过全局变量来实现信息的传递

如下变量在backend中有效:
.host:backend的主机名或者IP
.port:backend的端口

如下变量在处理一个请求(例如vcl_recv)的时候可用:
client.ip:客户端IP地址
server.hostname:服务器的主机名
server.identity:服务器标示,当启动varnish的时候用”-i”参数来指定如果varnish启动时候没有指定”-i”参数,那么server.identity会被设置为用”-n”参数所指定的实例名称
server.ip:服务器IP地址
server.port:服务器端口
req.request:请求类型(例如“GET”,“HEAD”)
req.url:请求的URL
req.proto:HTTP协议版本
req.backend:处理请求的后端服务器
req.backend.healthy:后端是否健康health check需要在backend的probe中进行设置
req.http.header:相关的HTTP头
req.hash_always_miss:强迫对于本次请求的缓存查找结果为miss如果设置为”true”,那么varnish将会忽略任何存在的缓存对象,一直从后端重新获取资源
req.hash_ignore_busy:在缓存查找时候忽略任何忙的对象如果有两个服务器,彼此互相查找缓存内容,那么可以使用这个变量来避免潜在的死锁

如下变量在准备一个后端请求(比如在cache miss或者pass,pipe模式)的时候可用:
bereq.request:请求的类型(比如“GET”,“HEAD”)
bereq.url:请求的URL
bereq.proto:与后端服务器交互的HTTP协议版本
bereq.http.header:相关的HTTP头
bereq.connect_timeout:与后端连接的超时时间
bereq.first_byte_timeout:从后端返回第一个字节所需等待的秒数,在pipe模式中不可用
bereq.between_bytes_timeout:从后端返回的每个字节之间的时间间隔,以秒计在pipe模式中不可用

如下的变量在请求对象从后端返回之后,在其被放入缓存之前可用换句话说,也就是在vcl_fetch中可用
beresp.proto:HTTP协议版本
beresp.status:后端返回的HTTP状态码(例如200,302等)
beresp.response:后端返回的状态内容(例如“OK”,“Found”)
beresp.cacheable:如果请求的结果是可以被缓存的,那么此变量为”true”如果HTTP状态码为200, 203, 300, 301, 302, 404,410之一并且pass没有在vcl_recv中被调用,那么这个结果就是可以被缓存的如果response的TTL和grace time都为0,那么beresp.cacheable将会为0beresp.cacheable是可写的
beresp.ttl:缓存对象的生存时间,以秒为单位,这个变量是可写的

在对象已经存在于缓存中并被查询到的时候,一般在vcl_hit和vcl_deliver中,如下的变量(大部分是read-only)可用:
obj.proto:与后端交互的HTTP版本协议
obj.status:后端返回的HTTP状态码
obj.response:后端返回的HTTP状态内容
obj.cacheable:如果对象的beresp.cacheable为”true”,那么此变量的值为”true”除非你强制delivery,否则obj.cacheable一直为”true”
obj.ttl:缓存对象的生存时间,以秒为单位,这个变量是可写的
obj.lastuse:从现在到对象最近一次访问所间隔的时间,以秒为单位
obj.hits:对象被发送到客户端的次数,0表示缓存查询miss了

如下变量在决定对象hash key的时候可用:
req.hash:hash key被用来关联一个缓存中的对象在读写缓存的时候都会被用到

如下变量在准备把一个响应发送给客户端时候可用:
resp.proto:响应使用的HTTP协议版本
resp.status:将要返回的HTTP状态码
resp.response:将要返回的HTTP状态内容
resp.http.header:相关的HTTP头

 



分享到: 更多

这篇日志的 QR 二维码为:

五月 21st, 2012

Posted In: linux系统

标签:,

6 Comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量