2013-09-03 10:55:55
来 源
itjs.cn
Varnish
本文介绍Varnish-2.13安装配置方法,希望对于Varnish入门者给与帮助。更多Varnish资源请本站内搜索。

2.X版本相对1.X版本的vcl语法有一些小的改动,原来的insert改名成了deliver,2.X版本需要使用return来调用 lookup,pass,pipe等功能。

2.1.3改动: vcl_fetch中 obj.http.Set-Cookie 变成 beresp.http.Set-Cookie ,也就是obj用beresp代替

一、Varnish 安装RedHat/CentOS系统环境下的依耐关系

yum install automake autoconflibtool ncurses-devel libxslt groff pcre-devel pkgconfig

可选择更新下pcre

tar jxvf pcre-8.02.tar.bz2

cd pcre-8.02

./configure-enable-ebcdic -enable-pcregrep-libbz2 -enable-pcregrep-libz

可选择:如果你的gcc版本是4.2.0或更高的版本,可以加上-enable-extra-warnings编译参数,在出错时,得到附加的警告信息。(备注:装这个超慢,现在我干脆不装了,出错的附加警告信息是浮云,大家就当看看gcc-4.2.0的简单安装吧)

tar zxvf gcc-4.2.4.tar.gz

cd gcc-4.2.4

mkdir /usr/local/gcc-4.2.4

./configure --prefix=/usr/local/gcc-4.2.4 --enable-threads=posix--disable-checking --host=i386-redhat-linux --with-system-zlib--enable-languages=c,c++

make

make install

设定环境变量,在/etc/profile里加入如下:

PATH=/usr/local/gcc-4.2.4/bin:$PATH

export PATH

LD_LIBRARY_PATH=/usr/local/gcc-4.2.4/lib:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

注销一下,或source /etc/profile,然后gcc-v看一下版本,如果是gcc-4.2.4就对了。

下载地址(2010-08-05为最新版)

http://nchc.dl.sourceforge.net/project/varnish/varnish/2.1.3/varnish-2.1.3.tar.gztar zxvf varnish-2.1.3.tar.gz

cd varnish-2.1.3.

/autogen.sh  检查软件的依耐关系是否满足(如果你是按我的步骤来的话,这个可无视)

./configure --prefix=/usr/local/varnish --enable-dependency-tracking --enable-debugging-symbols --enable-developer-warnings -enable-extra-warnings

make;make install

创建varnish用户和组,以及Varnish缓存文件存放目录(/usr/local/varnish/vcache):

/usr/sbin/groupadd varnish

/usr/sbin/useradd -M -d /dev/null -s /sbin/nologin  -g varnish varnish

mkdir /usr/local/varnish/vcache

chmod +w /usr/local/varnish/vcache

chown -R varnish:varnish /usr/local/varnish/vcache

创建Varnish日志目录(/usr/local/varnish/logs):

mkdir /usr/local/varnish/logschmod +w /usr/local/varnish/logs

chown -R varnish:varnish /usr/local/varnish/logs

chmod 777 /usr/local/varnish/cut_varnish_log.sh

chmod 777 /usr/local/varnish/varnish.sh

chmod 777 /usr/local/varnish/varnishlog.sh  

vi /usr/local/varnish/etc/varnish/default.vcl

backend rserver1

{   

.host ="172.16.8.147";   

.port = "80";   

.probe = {   

.timeout = 5s;           #等待多长时间超时   

.interval = 2s;            #检查的间隔时间   

.window = 10;            #varnish将维持10个slidingwindow的结果   

.threshold = 8;           #至少有8次.windows检查是成功的,就宣告backends健康   

}

}

backend rserver2

{   

.host ="172.16.8.155";   

.port = "80";   

.probe = {   

.timeout = 10s;         

.interval = 5s;         

.window = 10;           

.threshold = 8;   

}

}

#指定一个名为realserver组 使用roun-robin机制

director realserver round-robin {   

{     

.backend = rserver1;

#当使用random机制时,必须指定.weight(再简单点讲,roun-robin不能指定权重)

#.weight = 5;      

}   

{     

.backend = rserver2;

#.weight = 6; (权重越大,分配的访问越多,可根据服务器性能来设定)  

}

}

#Varnish允许localhost、127.0.0.1、后端真实IP等来源IP通过PURGE方法清除缓存;

acl purge {      

"localhost";      

"127.0.0.1";      

"172.16.8.147";      

"172.16.8.155";

}

#vcl_recv在请求的开始被调用,在接收、解析后,决定是否响应请求,怎么响应,使用哪个后台服务器。

sub vcl_recv

{

#对域名为172.16.8.149的请求使用realserver组处理,非域名的请求则返回“No cahce for this domain”      

  if (req.http.host ~"172.16.8.149")

  {           

     set req.backend =realserver;      

  }        

     else

     {           

       error 200 "Nocahce for this domain";      

     }                 

       if (req.request =="PURGE")

         {              

           if (!client.ip ~purge)

             {                 

                error 405"Not allowed.";              

             }      

          else

             {     

                return (pipe);      

             }     

}

#获取远端IP            

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;            

}

#对HTTP协议中的GET、HEAD请求进行缓存,对POST请求透过,让其直接访问后端Web服务器。之所以这样配置,是因为POST请求一般是发送数据给服务器的,需要服务器接收、处理,所以不缓存;                    

if (req.request !="GET" && req.request != "HEAD")

{              

return (pipe);      

}      

if (req.http.Expect)

{            

return (pipe);     

}     

if (req.http.Authenticate|| req.http.Cookie)

{              

return (pass);      

}      

if (req.http.Cache-Control~ "no-cache")

{            

return (pass);      

}

#对ASP或者PHP文件不缓存(这个应该不用解释吧)           

if(req.url ~".asp" || req.url ~ ".php" )

{              

return (pass);      

}      

else

{      

return (lookup);      

}

}sub vcl_pipe

{   

return (pipe);

}sub vcl_pass

{   

return (pass);

}sub vcl_hash

{   

set req.hash += req.url;   

if (req.http.host)

{        

set req.hash +=req.http.host;   

}

else

{      

set req.hash +=server.ip;   

}  

  return (hash);

}sub vcl_hit

{   

if (req.request =="PURGE")

{      

set obj.ttl = 0s;            

error 200"Purged.";   

}   

if (!obj.cacheable)

{        

return (pass);   

}   

return (deliver);

}sub vcl_miss

{      

if (req.request =="PURGE")

{        

error 404 "Not incache.";      

}

#阻止spider网络蜘蛛            

if (req.http.user-agent ~"spider")     

{         

error 503 "Notpresently in cache";      

}

     return (fetch);

}

# vcl_fetch在一个文件成功从后台获取后被调用,他的任务就是改变响应的头文件,触发ESI进程,在后台服务器轮询尝试失败的请求。

sub vcl_fetch

{

#Varnish对以.txt和.js结尾的URL缓存时间设置1小时,对其他的URL缓存时间设置为30天。      

if (req.request =="GET" && req.url ~ ".(txt|js)$")

{        

set beresp.ttl = 3600s;      

}      

else

{        

set beresp.ttl = 30d;     

}     

if (!beresp.cacheable)

{        

return (pass);     

}      

if (beresp.http.Set-Cookie)

{      

return (pass);     

}      

return (deliver);

}

sub vcl_deliver

{  

return (deliver);

}

sub vcl_error

{   

set obj.http.Content-Type ="text/html; charset=utf-8";   

synthetic {" <?xml version="1.0"encoding="utf-8"?> <!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html>   <head>     <title>"}obj.status " " obj.response {

"</title>   </head>   <body>     <h1>Error "}obj.status " " obj.response {"</h1>     <p>"}obj.response {"</p>     <h3>GuruMeditation:</h3>     <p>XID: "}req.xid {"</p>     <hr>     <p>Varnish cacheserver</p>   </body> </html> "

};   

return (deliver);

}

启动的方法:

/usr/local/varnish/sbin/varnishd -n/usr/local/varnish/vcache -f /usr/local/varnish/etc/varnish/default.vcl -a0.0.0.0:80 -s file,/usr/local/varnish/vcache/varnish_cache.data,1G -p user=varnish-p group=varnish -p default_ttl=14400 -p thread_pool_max=8000 -psend_timeout=20 -w 5,51200,30 -T 127.0.0.1:808 -P/usr/local/varnish/var/varnish.pid

参数说明:

-f /usr/local/varnish/etc/varnish/default.vcl   选项指定varnishd使用哪个配置文件(这个可以自己任意指定比较灵活)

-s file,/usr/local/varnish/vcache/varnish_cache.data,1G 这个 ?s 选项用来确定varnish使用的存储类型和存储容量,1G 定义多少内存。

-T 127.0.0.1:808    Varnish有一个基于文本的管理接口,启动它的话可以在不停止varnish的情况下来管理varnish。您可以指定管理软件监听哪个接口。启动后可以通过在本机telnet 127.0.0.1 808连接varnish的管理端口,查看运行状态等 help查看命令

-a 0.0.0.0:80   制定varnish监听所有IP发给80端口的http请求(也可指定特定IP)

-w 5,512000,30  控制每个进程的线程数的,格式:-w min,max,timeout [default: -w2,500,300],关于这个不能像1.XX版本那样设得很大,否则varnish会很慢。

#日志记录 varnishlog.sh

chmod777 /usr/local/varnish/varnishlog.sh

/usr/local/varnish/bin/varnishncsa-n  /usr/local/varnish/vcache -w /usr/local/varnish/logs/varnish.log

一个每天0点运行,按天切割Varnish日志,生成一个压缩文件,设置在每天00:00定时执行:

/usr/bin/crontab -e或者vi /var/spool/cron/root

chmod 777  /usr/local/varnish/cut_varnish_log.sh

00 00 * * */bin/bash  /usr/local/varnish/cut_varnish_log.sh

#!/bin/sh

# This file run at 00:00

date=$(date -d "yesterday" +"%Y-%m-%d")

pkill -9 varnishncsa

mv /usr/local/varnish/logs/varnish.log /usr/local/varnish/logs/${date}.log

/usr/bin/nohup /usr/local/varnish/varnishlog.sh >/dev/null 2>&1 &cd/usr/local/varnish/logs

tar zcvf ${date}.tar.gz ${date}.log

rm -f  ${date}.log

#停止脚本

killall -9 varnishd

killall -9 varnishncsa

通过Varnish管理端口,使用正则表达式批量清除缓存:

  (1)、例:清除类似http://blog.s135.com/a/zhangyan.html的URL地址):/usr/local/varnish/bin/varnishadm-T 127.0.0.1:808 url.purge /a/

  (2)、例:清除所有缓存:/usr/local/varnish/bin/varnishadm-T 127.0.0.1:808 url.purge *$  

通过Varnish管理端口进行管理,用help看看可以使用哪些Varnish命令:

/usr/local/varnish/bin/varnishadm-T 127.0.0.1:808 help

查看Varnish服务器连接数与命中率:

/usr/local/varnish/bin/varnishstat-n /usr/local/varnish/vcache

附:varnish.sh(用于start、stop、restart 的脚本,注意给予权限,例如启动  ./varnish.sh start)

#!/bin/shfunction_start_varnish()

{   

printf "Starting Varnish...n"

/usr/local/varnish/sbin/varnishd -n/usr/local/varnish/vcache -f /usr/local/varnish/etc/varnish/default.vcl -a0.0.0.0:80 -s file,/usr/local/varnish/vcache/varnish_cache.data,1G -puser=varnish -p group=varnish -p default_ttl=14400 -p thread_pool_max=8000 -psend_timeout=20 -w 5,51200,30 -T 127.0.0.1:808 -P/usr/local/varnish/var/varnish.pid

}function_stop_varnish()

{   

printf "Stoping Varnish...n"  

killall -9 varnishd    killall -9 varnishncsa

}function_restart_varnish()

{  

function_stop_varnish   

function_start_varnish

}

if ["$1" = "start" ]; then   

function_start_varnish

elif ["$1" = "stop" ]; then  

function_stop_varnish

elif ["$1" = "restart" ]; then   

function_restart_varnish

else    printf "Usage:/usr/local/varnish/varnish.sh {start|stop|restart}n"

fi

最后:varnish的确在稳定性方面比squid要强,但硬要说性能超出多少倍,那是广告用语。并且最关键的是,在规则制定以及资料文档方面,varnish远不如squid,要命的是,这小软件对语法改动太频繁

新手请看一下:

关于vcl_recv

在请求的开始被调用,在接收、解析后,决定是否响应请求,怎么响应,使用哪个后台服务器。在vcl_recv中,您可以修改请求,比如您可以修改cookies,添加或者删除请求的头信息。注意vcl_recv中只有请求的目标,req is available。

关于vcl_fetch

在一个文件成功从后台获取后被调用,他的任务就是改变响应的头文件,触发ESI进程,在后台服务器轮询尝试失败的请求。在vcl_fetch中一样的包含请求的目标,req,available,哪里通常是backendresponse,beresp.beresp将会包含后端服务器的HTTP的头信息

动作:(一定要搞明白的)

pass           当一个请求被pass后,这个请求将通过varnish转发到后端服务器,但是它不会被缓存。pass可以放在vcl_recv 和 vcl_fetch中。

lookup        当一个请求在vcl_recv中被lookup后,varnish将从缓存中提取数据,如果缓存中没有数据,将被设置为pass,不能在vcl_fetch中设置lookup。

pipe            pipe和pass相似,都要访问后端服务器,不过当进入pipe模式后,在此连接未关闭前,后续的所有请求都发到后端服务器

deliver        请求的目标被缓存,然后发送给客户端esi              

ESI-processthe fetched document 在VCL中,有3个重要的数据结构request 从客户端进来responses 从后端服务器过来object 存储在cache中              

在VCL中,你需要知道以下结构

req        请求目标,当varnish接收到一个请求,这时req object就被创建了,你在vcl_recv中的大部分工作,都是在req object上展开的。

beresp   后端服务器返回的目标,它包含返回的头信息,你在vcl_fetch中的大部分工作都是在beresp object上开展的。

obj        被cache的目标,只读的目标被保存于内存中,obj.ttl的值可修改,其他的只能读。      

OperaorsVCL支持一下运算符,请阅读下面的例子:              

=                   赋值运算符            

==                 对比              

~                   匹配,在ACL中和正则表达式中都可以用              

!                  否定            

&&                 逻辑与            

||                   逻辑或

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。