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得到日常維護