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 继续保留在缓存里
如果这些内置例程没有被定义,则执行缺省动作
转载于:https://blog.51cto.com/nebula/1259656