1.安装准备

yum -y install tomake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig

 2.编译安装varnish

cd varnish-3.0.2

./configure --prefix=/usr/local/varnish

make && make install

 3.配置文件

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

==============================================================================

acl purge {#推送地址ACL

"localhost";

"127.0.0.1";

"192.168.1.71"/32;

}


backend default {#默认源地址及端口

    .host = "192.168.1.151";

    .port = "80";

}


backend www1 {#www1后端服务器及端口

   .host = "192.168.1.150";

   .port = "80";

}


#backend www2 {          #www2后端服务器及端口

#    .host = "192.168.1.151";

#    .port = "80";

#}


backend www3 {          #www3后端服务器及端口

   .host = "192.168.1.51";

   .port = "80";

}


backend www4 {          #www4后端服务器及端口

   .host = "192.168.1.52";

   .port = "80";

}


backend www5 {          #www5后端服务器及端口

   .host = "192.168.1.53";

   .port = "80";

}


backend www6 {          #www6后端服务器及端口

   .host = "192.168.1.56";

   .port = "80";

}







##############配置后端服务器组,进行健康检测6秒,使用random方式设置权重########  

#########另一种方式round-robin则默认轮询机制####################

director www random {

.retries = 6;


{ .backend = www1;

 .weight = 2;

       }


#{ .backend = www2;

#  .weight = 2;

#        }  


       { .backend = www3;

         .weight = 2;

       }


       { .backend = www4;

         .weight = 2;

       }


       { .backend = www5;

         .weight = 2;

       }


       { .backend = www6;

         .weight = 2;

       }



}






sub vcl_recv {


     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;

      }





if (req.request =="PURGE") {#推送ip访问限制

if (!client.ip ~ purge) {

error 405 "Not allowed.";

              }

              return(lookup);


}

if (req.http.host ~ "(?i).*(haha|heihei|xixi).(com|com\.cn|cn)") { #网站域名访问限制,判断访问域名是否为*.haha.com,如是访问www源地址,否返回‘Unknown virtual host’ 注:(?i) 不区分大小写

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

set req.backend = www;

return(pipe);        

}



               elseif(req.url ~ "get_comment_number_ifram"){  #判断是否含有get_comment_number_ifram,有则缓存

                       set req.backend = www;

                       return(lookup);

               }





elseif(req.url ~ "\.(php|cgi)($|\?)"){#判断是否为php、cgi动态文件,如是去后端服务器抓取,否则缓存文件

set req.backend = www;

return(pass);

}

else {



#if (req.request == "GET" && req.url ~ "\.(css|mp3|jpg|png|gif|swf|jpeg|ico)$"){unset req.http.cookie;} #删除图片cookie提高命中率,否则命中率>对于论坛等会很低




set req.backend = default;

return(lookup);


}

}

else {

                       #set req.backend = default;

                       return(lookup);


#error 404 "Unknown virtual host";

#return(lookup);

}

}




sub vcl_hit {

if(req.request == "PURGE") {

set obj.ttl = 0s;

error 200 "Purged.";


}

}







==============================================================================


 4.启动

设置内核参数:

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 300

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 1024 65000


net.ipv4.tcp_max_syn_backlog = 819200

net.ipv4.ip_conntrack_max = 819200

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180

net.ipv4.netfilter.ip_conntrack_max = 8192000

net.core.netdev_max_backlog = 300000



启动

ulimit -SHn 36870

/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,4G -T 127.0.0.1:2000

访问日志进程

/usr/local/varnish/bin/varnishncsa -D -w /var/log/varnish/varnish.log

日志定时切换脚本

cat /home/crontab/cut_varnish_log.sh

#!/bin/sh

# This file run at 00:05

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

date1=$(date -d "4 day ago" +"%Y-%m-%d")

pkill -9 varnishncsa

mv /var/log/varnish/varnish.log /var/log/varnish/varnish_${date}.log

/usr/local/varnish/bin/varnishncsa -D  -w /var/log/varnish/varnish.log

rm -f /var/log/varnish/varnish_${date1}.log

定时任务:

50***/home/crontab/cut_varnish_log.sh

状态查看:

/usr/local/varnish/bin/varnishstat


指定域名清缓存

./varnishadm ban "req.http.host ~ ^www.haha.com && req.url ~ /index.html"



 5.其他:

varnish内置的例程

vcl_recv

有请求到达后成功接收并分析时被调用,一般以以下几个关键字结束。

error code [reason] 返回code给客户端,并放弃处理该请求

pass 进入pass模式,把控制权交给vcl_pass

pipe 进入pipe模式,把控制权交给vcl_pipe

lookup 在缓存里查找被请求的对象,根据查找结果把控制权交给vcl_hit或vcl_miss


vcl_pipe

进入pipe模式时被调用。请求被直接发送到backend,后端和客户端之间的后继数据不进行处理,只是简单传递,直到一方关闭连接。一般以以下几个关键字结束。

error code [reason]

pipe


vcl_pass

进入pass模式时被调用。请求被送到后端,后端应答数据送给客户端,但不进入缓存。同一连接的后继请求正常处理。一般以以下几个关键字结束。

error code [reason]

pass


vcl_hash

目前不使用


vcl_hit

在lookup以后如果在cache中找到请求的内容事调用。一般以以下几个关键字结束。

error code [reason]

pass

deliver 将找到的内容发送给客户端,把控制权交给vcl_deliver.


vcl_miss

lookup后但没有找到缓存内容时调用,可以用于判断是否需要从后端服务器取内容。一般以以下几个关键字结束。

error code [reason]

pass

fetch 从后端取得请求的内容,把控制权交给vcl_fetch.


vcl_fetch

从后端取得内容后调用。一般以以下几个关键字结束。

error code [reason]

pass

insert 将取到的内容插入缓存,然后发送给客户端,把控制权交给vcl_deliver



vcl_deliver

缓存内容发动给客户端前调用。一般以以下几个关键字结束。

error code [reason]

deliver 内容发送给客户端


vcl_timeout

在缓存内容到期前调用。一般以以下几个关键字结束。

fetch 从后端取得该内容

discard 丢弃该内容



vcl_discard

由于到期或者空间不足而丢弃缓存内容时调用。一般以以下几个关键字结束。

discard 丢弃

keep 继续保留在缓存里


如果这些内置例程没有被定义,则执行缺省动作