mkdir /data/varnish/cache
mkdir /data/varnish/log
chown -R varnish:varnish /data/varnish/cache
chown -R varnish:varnish /data/varnish/log
./configure --prefix=/usr/local/pcre
make && make install
yum install ncurses-devel
export PKG_CONFIG_PATH=/usr/local/pcre/lib/pkgconfig
make install
backend wiki {
.host = "192.168.137.111";
.port = "80";
.connect_timeout = 1s;
.first_byte_timeout = 5s;
.between_bytes_timeout = 2s;
}
backend server82 {
.host = "192.168.137.111";
.port = "82";
}
backend server83 {
.host = "192.168.137.111";
.port = "83";
}
backend server84 {
.host = "192.168.137.111";
.port = "84";
}
###############定义一个名字为server的director
director server random {
{.backend = server82; .weight=5;}
{.backend = server83; .weight=5;}
{.backend = server84; .weight=5;}
}
###############设置清理缓存规则varnish允许那些IP通过PURGE方法清除缓存
acl purge {
"localhost";
"127.0.0.1";
"192.168.137.0"/26;
}
#################非允许IP发送PURGE清理缓存时将返回405状态
sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
return(lookup);
}
}
if (req.http.host ~ "^wiki.wangqiao.cn") {
set req.backend = wiki;
}
else
if(req.http.host ~ "^server.wangqiao.cn") {
set req.backend = server;
}
else
if(req.http.host ~ "^(.*).wangqiao.cn" || req.http.host ~ "^(.*).wangqiao.com") {
set req.backend = server;
}
else
{
error 404 "Wang Qiao Cache Server";
}
###########清除url中有jpg|png|gif等文件的cookie
if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|ico)$") {
unset req.http.cookie;
}
##########判断req.http.X-Forwarded-For ,如果前端有多重反向代理,这样可以获取客户端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;
}
####################如果请求的类型不是GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE时,进入pipe模式
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
return (pipe);
}
########如果请求的类型不是GET与HEAD,则进入pass模式。
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}
########请求以.cgi和.php结尾带有?的url时不进行缓存直接从后端服务器读取内容
if (req.http.Authorization || req.http.Cookie) {
return (pass);
}
if (req.request == "GET" && req.url ~ "\.(cgi|php)($|\?)") {
return (pass);
}
return (lookup);
}
sub vcl_pipe {
return (pipe);
}
sub vcl_pass {
return (pass);
}
#######如果请求的类型是PURGE方法,varnish会将此请求的缓存周期设置为0,也就是使这个url的缓存失败从而刷新varnish缓存的目的
sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
}
sub vcl_miss {
return (fetch);
}
###############定义不同的缓存时间###
sub vcl_fetch {
if (req.request == "GET" && req.url ~ "\.(png|xsl|xml|pdf|ppt|doc|docx|chm|rar|zip|bmp|jpeg|swf|ico|mp3|mp4|rmvb|ogg|mov|avi|wmv|swf|txt|png|gif|jpg|css|js)$")
{
set beresp.ttl = 1d;
}
if (req.request == "GET" && req.url ~ "\.(html|htm)$") {
set beresp.ttl = 1d;
}
if (req.request == "GET" && req.url ~ "^/upload(.*)$") {
set beresp.ttl = 300s;
}
#################当url中包含server时不进行缓存
if (req.url ~ "^/services/") {
return (deliver);
}
##########定义在什么状态下进入restart模式
if (beresp.status == 500 || beresp.status == 501 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504 || beresp.status == 404) {
return (restart);
}
###########定义不缓存含有那些HTTP头请求
if (beresp.http.Pragma ~ "no-cache" ||
beresp.http.Cache-Control ~ "no-cache" ||
beresp.http.Cache-Control ~ "private") {
return (deliver);
}
}
###########添加一个header标识,以判断缓存是否命中
sub vcl_deliver {
set resp.http.x-hits = obj.hits;
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT form wangqiao";
} else {
set resp.http.X-Cache = "MISS from wangqiao";
}
return(deliver);
}
##############定义hash值并处理压缩内容
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
remove req.http.Accept-Encoding;
remove req.http.Cookie;
} else if (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip"; }
else if (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
}
else {
remove req.http.Accept-Encoding;
}
}
return (hash);
}
(1)vcl_recv函数
用于接收和处理请求,当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求。
此函数一般以如下几个关键字结束:
q pass:表示进入pass模式,把请求控制权交给vcl_pass函数。
q pipe:表示进入pipe模式,把请求控制权交给vcl_pipe函数。
q error code [reason]:表示返回“code”给客户端,并放弃处理该请求,“code”是错误标识,例如200、405等,“reason”是错误提示信息。
(2)vcl_pipe函数
此函数在进入pipe模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个链接关闭。
此函数一般以如下几个关键字结束:
q error code [reason]
q pipe
(3)vcl_pass函数
此函数在进入pass模式时被调用,用于将请求直接传递至后端主机,后端主机应答数据后送给客户端,但不进行任何缓存,在当前连接下每次都返回最新的内容。
此函数一般以如下几个关键字结束:
q error code [reason]
q pass
(4)lookup
表示在缓存里查找被请求的对象,并且根据查找的结果把控制权交给函数vcl_hit或者函数vcl_miss。
(5)vcl_hit函数
在执行lookup指令后,如果在缓存中找到请求的内容,将自动调用该函数。
此函数一般以如下几个关键字结束:
q deliver:表示将找到的内容发送给客户端,并把控制权交给函数vcl_deliver。
q error code [reason]
q pass
(6)vcl_miss函数
在执行lookup指令后,如果没有在缓存中找到请求的内容时自动调用该方法,此函数可以用于判断是否需要从后端服务器取内容。
此函数一般以如下几个关键字结束:
q fetch:表示从后端获取请求的内容,并把控制权交给vcl_fetch函数。
q error code [reason]
q pass
(7)vcl_fetch函数
在从后端主机更新缓存并且获取内容后调用该方法,接着,通过判断获取的内容来决定是否将内容放入缓存,还是直接返回给客户端。
此函数一般以如下几个关键字结束:
q error code [reason]
q pass
q deliver
(8)vcl_deliver函数
在缓存中找到请求的内容后,发送给客户端前调用此方法。此函数一般以如下几个关键字结束:
q error code [reason]
q deliver
(9)vcl_timeout 函数
此函数在缓存内容到期前调用。一般以如下几个关键字结束:
q discard:表示从缓存中清除该内容。
q fetch
(10)vcl_discard函数
在缓存内容到期后或缓存空间不够时,自动调用该方法,一般以如下几个关键字结束:
q keep:表示将内容继续保留在缓存中。
q discard
varnish得到日常维护