1. 程式人生 > 實用技巧 >varnish簡單學習

varnish簡單學習

作業系統:redhat5.5

前端伺服器:varnish cache 2.1.5 監聽埠8080

後端伺服器:tengine 1.4.6 監聽埠80


接著,建立varnish使用者以及使用者組,並且建立Varnish快取目錄和日誌目錄:
[[email protected] ~]#useradd -s /sbin/nologin varnish
[[email protected] ~]#mkdir /data/varnish/cache
[[email protected] ~]#mkdir /data/varnish/log
[[email protected] ~]#chown -R varnish:varnish /data/varnish/cache


[[email protected] ~]#chown -R varnish:varnish /data/varnish/log

編譯安裝pcre

[[email protected] ~]#tar zxvf pcre-8.0.tar.gz
[[email protected] ~]#cd pcre-8.0/
[[email protected] ~]#./configure --prefix=/usr/local/pcre/
[[email protected] ~]#make && make install

編譯安裝varnish

[[email protected]

~]#tar -zxvf varnish-2.1.5.tar.gz
[[email protected] ~]#cd varnish-2.1.5
[[email protected] ~]#export PKG_CONFIG_PATH=/usr/local/pcre/lib/pkgconfig
[[email protected] ~]#./configure --prefix=/usr/local/varnish \
>--enable-dependency-trackin
>--enable-debugging-symbols
>--enable-developer-warnings

[[email protected] ~]#make
[[email protected] ~]#make install

其中,“PKG_CONFIG_PATH”是指定varnish查詢pcre庫的路徑,如果pcre安裝在了其它路徑下,在這裡指定相應的路徑即可,Varnish預設查詢的pcre庫路徑為/usr/local/lib/ pkgconfig。最後兩步操作是拷貝一些varnish守護程序的初始化指令碼檔案,這些指令碼用於varnish的啟動、關閉管理等方面,在下面章節中會進行詳細講解。
至此,varnish安裝完畢。


配置說明

1、VCL使用說明
VCL,即為Varnish Configuation Language,用來定義varnish的存取策略,VCL語法比較簡單,跟C和perl比較相似,可以使用指定運算子“=”,比較運算子“==”,邏輯運算子“!,&&,!!”等形式。還支援正則表達樣和用“~”進行ACL匹配運算,同時還可以使用“set”這樣的關鍵字來指定變數。
需要注意的是,“\”字元在VCL裡沒有特別的含義,這點與其它語言略有不同,另外,VCL只是配置,並不是真正的程式語言,沒有迴圈,也沒有自定義變數。
在講述Varnish配置之前,首先需要了解下varnish的配置語法,即VCL,下面對VCL常用的一些內建函式和公用變數進行詳細介紹。
VCL內建函式
(1)vcl_recv函式
用於接收和處理請求,當請求到達併成功接收後被呼叫,通過判斷請求的資料來決定如何處理請求。
此函式一般以如下幾個關鍵字結束:
pass:表示進入pass模式,把請求控制權交給vcl_pass函式。
pipe:表示進入pipe模式,把請求控制權交給vcl_pipe函式。
error code [reason]:表示返回“code”給客戶端,並放棄處理該請求,“code”是錯誤標識,例如200、405等,“reason”是錯誤提示資訊。

(2)vcl_pipe函式
此函式在進入pipe模式時被呼叫,用於將請求直接傳遞至後端主機,在請求和返回的內容沒有改變的情況下,將不變的內容返回給客戶端,直到這個連結關閉。
此函式一般以如下幾個關鍵字結束:
error code [reason]
pipe
(3)vcl_pass函式
此函式在進入pass模式時被呼叫,用於將請求直接傳遞至後端主機,後端主機應答資料後送給客戶端,但不進行任何快取,在當前連線下每次都返回最新的內容。
此函式一般以如下幾個關鍵字結束:
error code [reason]
pass
(4)lookup
表示在快取裡查詢被請求的物件,並且根據查詢的結果把控制權交給函式vcl_hit或者函式vcl_miss。
(5)vcl_hit函式
在執行lookup指令後,如果在快取中找到請求的內容,將自動呼叫該函式。
此函式一般以如下幾個關鍵字結束:
deliver:表示將找到的內容傳送給客戶端,並把控制權交給函式vcl_deliver。
error code [reason]
pass

(6)vcl_miss函式
在執行lookup指令後,如果沒有在快取中找到請求的內容時自動呼叫該方法,此函式可以用於判斷是否需要從後端伺服器取內容。
此函式一般以如下幾個關鍵字結束:
fetch:表示從後端獲取請求的內容,並把控制權交給vcl_fetch函式。
error code [reason]
pass
(7)vcl_fetch函式
在從後端主機更新快取並且獲取內容後呼叫該方法,接著,通過判斷獲取的內容來決定是否將內容放入快取,還是直接返回給客戶端。
此函式一般以如下幾個關鍵字結束:
error code [reason]
pass
deliver
(8)vcl_deliver函式
在快取中找到請求的內容後,傳送給客戶端前呼叫此方法。此函式一般以如下幾個關鍵字結束:
error code [reason]
deliver

(9)vcl_timeout 函式
此函式在快取內容到期前呼叫。一般以如下幾個關鍵字結束:
discard:表示從快取中清除該內容。
fetch
(10)vcl_discard函式
在快取內容到期後或快取空間不夠時,自動呼叫該方法,一般以如下幾個關鍵字結束:
keep:表示將內容繼續保留在快取中。
discard

2、VCL處理流程圖
通過上面對VCL函式的介紹,讀者對各個函式實現的功能已經有了一個瞭解,其實每個函式之間都是相互關聯的,下圖列出了varnish處理HTTP請求的一個執行流程圖。

處理過程大致分為如下幾個步驟:

(1)Receive狀態,也就是請求處理的入口狀態,根據VCL規則判斷該請求應該是Pass或Pipe,或者進入Lookup(本地查詢)。
(2)Lookup狀態,進入此狀態後,會在hash表中查詢資料,若找到,則進入Hit狀態,否則進入miss狀態。
(3)Pass狀態,在此狀態下,會進入後端請求,即進入fetch狀態。
(4)Fetch狀態,在Fetch狀態下,對請求進行後端的獲取,傳送請求,獲得資料,並進行本地的儲存。
(5)Deliver狀態, 將獲取到的資料傳送給客戶端,然後完成本次請求。
3、內建公用變數
VCL內建的公用變數可以用在不同的VCL函式中,根據這些公用變數使用的不同階段,下面依次介紹。
當請求到達後,可以使用的公用變數如表2所示:
表2
公用變數名稱 含義
req.backend 指定對應的後端主機
server.ip 表示伺服器端IP
client.ip 表示客戶端IP
req.request 指定請求的型別,例如GET、HEAD、POST等
req.url 指定請求的地址
req.proto 表示客戶端發起請求的HTTP協議版本
req.http.header表示對應請求中的http頭部資訊
req. restarts 表示請求重啟的次數,預設最大值為4
Varnish 在向後端主機請求時,可以使用的公用變數如表3所示:
表3

公用變數名稱含義
beresp.request指定請求的型別,例如GET、HEAD等
beresp.url指定請求的地址
beresp .proto表示客戶端發起請求的HTTP協議版本
beresp .http.header表示對應請求中的http頭部資訊
beresp .ttl表示快取的生存週期,也就是cache保留多長時間,單位是秒
從cache或者後端主機獲取內容後,可以使用的公用變數如表4所示:

表4
公用變數名稱含義
obj.status表示返回內容的請求狀態程式碼,例如200、302、504等
obj.cacheable表示返回的內容是否可以快取,也就是說,如果HTTP返回是200、203、300、301、302、404、410等,並且有非0的生存期,則可以快取
obj.valid表示是否是有效的HTTP應答
obj.response表示返回內容的請求狀態資訊
obj.proto表示返回內容的HTTP協議版本
obj.ttl表示返回內容的生存週期,也就是快取時間,單位是秒
obj.lastuse表示返回上一次請求到現在的間隔時間,單位是秒
對客戶端應答時,可以使用的公用變數如表5所示:

表5
公用變數名稱含義
resp.status表示返回給客戶端的HTTP狀態程式碼
resp.proto表示返回給客戶端的HTTP協議版本
resp.http.header表示返回給客戶端的HTTP頭部資訊
resp.response表示返回給客戶端的HTTP狀態資訊
在上面的講述中,我們只是介紹了常用的VCL內建公用變數,如果需要了解和使用更多的公用變數資訊,請登入varnish官方網站查閱。

三 、配置一個簡單的Varnish例項
由於版本的不同,Varnish配置檔案的寫法也存在一定差異,varnish2.x版本和1.x版本之間不但配置檔案寫法不同,而且新的版本功能也增加很多,並且去除了很多應用BUG,這裡講述的版本是varnish2.1.2,配置檔案寫法也以varnish2.x版本為基準。
Varnish安裝完成後,預設的配置檔案為/usr/local/varnish/etc/varnish/default.vcl,此檔案內容預設全部被註釋掉了,這裡,我們以這個檔案為模板,建立一個新的檔案vcl.conf,並且放到/usr/local/varnish/etc目錄下,配置完成的vcl.conf檔案如下:
#通過backend定義了一個名稱為webserver的後端主機,“.host”指定後端主機的IP地址或者域名,“.port”指定後端主機的服務埠

backend webserver {
.host = "127.0.0.1";
.port = "80";
}

#呼叫vcl_recv開始。
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;
}
#如果請求的型別不是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);
}

#對ixdba.net或者ixdba.cn兩個域名進行快取加速,這是個泛域名的概念,也就是所有以ixdba.net或者ixdba.cn結尾的域名都進行快取。
if (req.http.host ~ "^(.*).ixdba.net" || req.http.host ~ "^(.*).ixdba.cn") {
set req.backend = webserver;
}

#對以.jsp和.do結尾以及帶有?的URL時,直接從後端伺服器讀取內容。
if (req.url ~ "\.(jsp|do)($|\?)") {
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 (!obj.cacheable) {
return (pass);
}
return (deliver);
}

sub vcl_miss {
return (fetch);
}

sub vcl_fetch {
if (!beresp.cacheable) {
return (pass);
}
if (beresp.http.Set-Cookie) {
return (pass);
}

#當url中包含servlet時,不進行快取。
if (req.url ~ "^/servlet/") {
return (pass);
}

#對於請求型別是GET,並且請求的URL中包含upload,那麼就進行快取,快取的時間是300秒,即5分鐘。
if (req.request == "GET" && req.url ~ "^/upload(.*)$") {
set beresp.ttl = 300s;
}

#對於請求型別是GET,並且請求的URL以png、xsl、xml、gif、css、js等結尾時,則進行快取,快取時間為600秒。
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|html|htm)$") {
set beresp.ttl = 600s;
}
return (deliver);
}

啟動varnish服務:

啟動引數說明
-a address:port # varnishd httpd監聽地址及其埠
-b address:port # 後臺伺服器地址及其埠
# -b
# -b ‘:’
-d # 使用debug模式
-f file # varnishd 伺服器存取規則檔案
-F # Run in foreground
-h kind[,hashoptions] # Hash specification
# -h simple_list
# -h classic [default]
# -h classic,
-n dir # varnishd working directory
-P file # PID file
-p param=value # 伺服器引數,用來優化效能
-s kind[,storageoptions] # 快取內容存放方式
# -s malloc
# -s file [default: use /tmp]
# -s file,
# -s file,,
-t # Default TTL
-T address:port # telnet管理地址及其埠
-V # version
-w int[,int[,int]] # 工作執行緒數
# -w
# -w min,max
# -w min,max,timeout [default: -w1,1000,120]

./varnishd -a 10.127.64.223:8080 -T 10.127.64.223:8081 -f /usr/local/varnish/etc/vcl.conf

varnish狀態檢視:

Varnish提供了一個varnishstat命令,通過它可以獲得很多重要的資訊。

####################

0+00:48:33 WEB_YQ_64.223

Hitrate ratio: 1 1 1

Hitrate avg: 0.7333 0.7333 0.7333


12 0.00 0.00 Client connections accepted

45 0.00 0.02 Client requests received

33 0.00 0.01 Cache hits

12 0.00 0.00 Cache misses

4 0.00 0.00 Backend conn. success

8 0.00 0.00 Backend conn. reuses

3 0.00 0.00 Backend conn. was closed

12 0.00 0.00 Backend conn. recycles

7 0.00 0.00 Fetch with Length

5 0.00 0.00 Fetch chunked

10 . . N struct sess_mem

2 . . N struct objectcore

2 . . N struct objecthead

1 . . N struct smf

1 . . N large free smf

1 . . N struct vbe_conn

10 . . N worker threads

10 0.00 0.00 N worker threads created

1 . . N backends

10 . . N expired objects

11 . . N LRU moved objects

39 0.00 0.01 Objects sent with write

12 0.00 0.00 Total Sessions

45 0.00 0.02 Total Requests

12 0.00 0.00 Total fetch

9397 0.00 3.23 Total header bytes

336431 0.00 115.49 Total body bytes

45 0.00 0.02 Session Linger

42 0.00 0.01 Session herd

##################

這裡需要注意以下幾點:

“Client connections accepted”表示客戶端向反向代理伺服器成功傳送HTTP請求的總數量。

“Client requests received”表示到現在為止,瀏覽器向反向代理伺服器傳送HTTP請求的累計次數。由於可能會使用長連線,因此這個值一般會大於“Client connections accepted”的值。

“Cache hits”表示反向代理伺服器在快取區中查詢並且命中快取的次數。

“Cache misses”表示直接訪問後端主機的請求數量,也就是非命中數。

“N struct object”表示當前被快取的數量。

“N expired objects”表示過期的快取內容數量。

“N LRU moved objects”表示被淘汰的快取內容個數。



轉載於:https://blog.51cto.com/zhangshaoxiong/1429825