Varnish配置文件詳解(架構師之路)
既然Varnish需要在多臺服務器上緩存數據,就需要Varnish映射所有的URL到一臺單獨的主機。
backend webserver {
.host = "127.0.0.1";
.port = "80";
.connect_timeout = 4s;
.first_byte_timeout = 5s;
.between_bytes_timeout = 20s;
}
該塊配置用于定義一臺Varnish默認訪問的后端服務器,當Varnish需要從后端服務器獲取數據時,就會訪問自己的80端口。
當然Varnish也可以定義多臺后端服務器實現負載均衡的目的。
.connect_timeout定義的是等待連接后端的時間
.first_byte_timeout定義的是等待從backend傳輸過來的第一個字節(jié)的時間
.between_bytes_timeout 定義的是兩個字節(jié)的間隔時間
當然還可以增加一個backend,用于訪問本機的8090端口,假設通過該端口提供圖片服務。
backend img {
.host = "127.0.0.1";
.port = "8090";
}
當匹配img的URL時,需把請求發(fā)送到上面定義的backend img,其他的請求發(fā)送到backend webserver。
sub vcl_recv {
if (req.url ~ "^/img/") {
set req.backend = img;
} else {
set req.backend = webserver.
}
}
Varnish不僅僅可以定義多個backend,還可以把多個backend合成一個組,使用循環(huán)的方式把請求分配給組中的backends。并且Varnish會根據健康檢查情況來判斷后端服務器是否正常提供服務。
Varnish使用區(qū)域語言VCL來管理定義Varnish的存取策略。VCL語法簡單,跟Perl比較相似,可以使用多種運算符如"="、"=="、"!,&&,!!"等形式;也可以使用正則表達式來進行匹配,還可以使用"set"來指定變量。當執(zhí)行VCL時,Varnish會先把VCL轉換成二進制代碼。
有一點要注意,"\"字符在VCL里沒有什么特別的含義,這點和其他語言不同。另外,VCL只是配置語言,并不是真正的編程語言,所以沒有循環(huán)和自定義變量。
為了可以更好地對Varnish進行配置調整,需要了解Varnish的配置語法,也就是VCL語言。下面對VCL常用的一些函數和變量進行介紹。
(1)vcl_recv模塊
用于接收和處理請求。當請求成功被調用后,Varnish通過判斷請求的數據來決定如何處理請求。此模塊一般以如下幾個關鍵字結束。
pass:表示進入pass模式,把請求交給vcl_pass模塊處理。
pipe:表示進入pipe模式,把請求交給vcl_pipe模塊處理。
error code [reason]:表示把錯誤標識返回給客戶端,并放棄處理該請求。錯誤標識包括200、405等。"reason"是對錯誤的提示信息。
(2)vcl_pipe模塊
此模塊在請求進入pipe模式時被調用,用于將請求直接傳遞至后端主機,在請求和返回的內容沒有改變的情況下,也就是在當前連接未關閉時,服務器將不變的內容返回給客戶端,直到該連接被關閉。
(3)vcl_pass模塊
此模塊表示當請求被pass后,用于將請求直接傳遞至后端應用服務器。后端應用服務器在接收請求后將數據發(fā)送給客戶端,但不進行任何數據的緩存,在當前連接下每次都返回最新的內容。
(4)lookup
一個請求在vcl_recv中被lookup后,Varnish將在緩存中提取數據。如果緩存中有相應的數據,就把控制權交給vcl_hit模塊;如果緩存中沒有相應的數據,請求將被設置為pass并將其交給vcl_miss模塊。
(5)vcl_hit模塊
執(zhí)行l(wèi)ookup指令后,Varnish在緩存中找到請求的內容后將自動調用該模塊。
在此模塊中,deliver表示將找到的數據發(fā)送給客戶端,并把控制權交給vcl_deliver模塊。
(6)vcl_miss模塊
執(zhí)行l(wèi)ookup后,Varnish在緩存中沒有找到請求的內容時會自動調用該方法。此模塊可以用于判斷是否需要從后端服務器獲取內容。
在此模塊中,fetch表示從后端獲取請求的數據,并把控制權交給vcl_fetch模塊。
(7)vcl_fetch模塊
在后端主機更新緩存并且獲取內容后調用該方法,接著,通過判斷獲取的內容來決定是將內容放入緩存,還是直接返回給客戶端。
(8)vcl_deliver模塊
當一個沒有被緩存的數據交付給客戶端的時候被調用。
(9)vcl_timeout 模塊
在緩存數據到期前調用此模塊。
在此模塊中,discard表示從緩存中清除到期數據。
(10)vcl_discard模塊
在緩存數據到期后或緩存空間不夠時,自動調用該模塊。
在此模塊中keep表示將數據繼續(xù)保留在緩存中。
acl purge {
"localhost";
"127.0.0.1";
"18.81.12.10";
}
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
return(lookup);
}
這兩個規(guī)則定義了允許哪些主機通過HTTP來執(zhí)行PURG進行緩存刪除。如果不是指定的IP,就會出現HTTP 405錯誤,提示Not allowed錯誤字樣。
if (req.http.host ~ "^(read)?.aaa.com$") {
set req.backend = webserver;
if (req.request != "GET" && req.request != "HEAD") {
return(pipe);
}
else {
return(lookup);
}
}
else {
error 404 " Cache Server";
return(lookup);
}
這段條件判斷用于對aaa.com域名進行緩存加速,aaa.com是泛指概念,也就是說所有以aaa.com結尾的域名都進行緩存。而if (req.request != "GET" && req.request != "HEAD") 表示"如果請求的類型不是GET與HEAD",則返回錯誤碼404。
if (req.url ~ "^/images") {
unset req.http.cookie;
}
這條規(guī)則的意思是清除服務器上/images目錄下的所有緩存,當這個請求在后端服務器生效時,如果訪問的URL匹配這個規(guī)則,那么頭信息中的cookie就會被刪除。
if (req.request == "GET" && req.url ~ "\. (png|swf|txt|png|gif|jpg|css|js|htm| html)$") {
unset req.http.cookie;
}
if (req.http.x-forwarded-for) {
set reqreq.http.X-Forwarded-For =
req.http.X-Forwarded-For ", " client.ip; }
else { set req.http.X-Forwarded-For = client.ip; }
因為Squid、Varnish都會把客戶端的IP地址放在HTTP_X_FORWARDED_FOR里面?zhèn)鹘o后端的Web服務器,所以后端的Web程序都要對其進行調用。
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
return (pipe);
}
該if判斷表示如果請求的類型不是GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE時,則進入pipe模式。注意這里的"&&"是與的關系。
if (req.request == "GET" && req.url ~ "\. (png|swf|txt|png|gif|jpg|css|js|htm| html)") {
set beresp.ttl = 180s;
}
else {
set beresp.ttl = 30d;
}
return (deliver);
}
該if判斷用于對請求類型是GET,并且請求的URL以png、swf、txt、gif、css、js等結尾時,則進行緩存,緩存時間為180秒。其他緩存為30天。
sub vcl_deliver {
set resp.http.x-hits = obj.hits ;
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT read.easouu.com";
}
else {
set resp.http.X-Cache = "MISS read.easou.com";
}
這個模塊定義的是添加一個Header標識,以判斷緩存是否命中。
sub vcl_error {
set obj.http.Content-Type = "text/html; charset=utf-8";
synthetic {"
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict// EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>"} obj.status " " obj.response {"</title>
</head>
<body>
<h1>Error "} obj.status " " obj.response {"</h1>
<p>"} obj.response {"</p>
<h3>Guru Meditation:</h3>
<p>XID: "} req.xid {"</p>
<hr>
<address>
<a >read.easou.com</a>
</address>
</body>
</html>
"};
return (deliver);
}
最后這個模塊定義了訪問錯誤頁面時的返回信息。
現在varnish配置基本完成,可以在8080端口上啟動varnish,并進行一些基本的測試。
Varnish緩存的配置
簡單的配置文件內容如下:
backend webserver { .host = "127.0.0.1"; .port = "8090"; .connect_timeout = 4s; .first_byte_timeout = 5s; .between_bytes_timeout = 20s; } acl purge { "localhost"; "127.0.0.1"; "18.81.12.10"; } sub vcl_recv { if (req.request == "PURGE") { if (!client.ip ~ purge) { error 405 "Not allowed."; } return(lookup); } if (req.http.host ~ "^(read)?.easou.com$") { set req.backend = webserver; if (req.request != "GET" && req.request != "HEAD") { return(pipe); } else { return(lookup); } } else { error 404 " Cache Server"; return(lookup); } if (req.request == "GET" && req.url ~ "\.(png|swf|txt|png|gif|jpg|css|js| htm|html)$") { unset req.http.cookie; } if (req.url ~ "^/images") { unset req.http.cookie; } if (req.http.Cache-Control ~ "(no-cache|max-age=0)") { purge_url(req.url); } return (lookup); if (req.http.x-forwarded-for) { set reqreq.http.X-Forwarded-For = req.http.X-Forwarded-For ", " client.ip; } else { set req.http.X-Forwarded-For = client.ip; } if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") { return (pipe); } if (req.request != "GET" && req.request != "HEAD") { return (pass); } if (req.http.Authorization || req.http.Cookie) { return (pass); } } sub vcl_pipe { # set req.http.connection = "close"; return (pipe);} sub vcl_hit { if (!obj.cacheable) { return (pass); } if (req.request == "PURGE") { set obj.ttl = 0s; error 200 "Purged."; } return (deliver); } sub vcl_miss { return (fetch); } sub vcl_fetch { if (!beresp.cacheable) { return (pass); } if (beresp.http.Set-Cookie) { return (pass); } if (beresp.http.Pragma ~ "no-cache" || beresp.http.Cache-Control ~ "no-cache" || beresp.http.Cache-Control ~ "private") { return (pass); } if (req.url ~ "^/cover/") { set beresp.ttl = 1800s; } else { set beresp.ttl = 30d; } return (deliver); # if (req.request == "GET" && req.url ~ "\.(png|swf|txt|png|gif|jpg|css|js| htm|html|jsp)") { # set beresp.ttl = 180s; # } # else { # set beresp.ttl = 30d; # } # return (deliver); } sub vcl_deliver { set resp.http.x-hits = obj.hits ; if (obj.hits > 0) { set resp.http.X-Cache = "HIT read.easouu.com"; } else { set resp.http.X-Cache = "MISS read.easou.com"; } } sub vcl_error { set obj.http.Content-Type = "text/html; charset=utf-8"; synthetic {" <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>"} obj.status " " obj.response {"</title> </head> <body> <h1>Error "} obj.status " " obj.response {"</h1> <p>"} obj.response {"</p> <h3>Guru Meditation:</h3> <p>XID: "} req.xid {"</p> <hr> <address> <a >read.easou.com</a> </address> </body> </html> "}; return (deliver); }
Varnish 簡介
Varnish 是一款高性能且開源的反向代理服務器和 HTTP 加速器,其采用全新的軟件體系機構,和現在的硬件體系緊密配合,與傳統(tǒng)的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優(yōu)點,很多大型的網站都開始嘗試使用 varnish 來替換 squid,這些都促進 varnish 迅速發(fā)展起來。
挪威的最大的在線報紙 Verdens Gang(vg.no) 使用 3 臺 Varnish 代替了原來的 12 臺 Squid,性能比以前更好,這是 Varnish 最成功的應用案例。
Varnish 文件緩存的工作流程
Varnish 與一般服務器軟件類似,分為 master 進程和 child 進程。Master 進程讀入存儲配置文件,調用合適的存儲類型,然后創(chuàng)建 / 讀入相應大小的緩存文件,接著 master 初始化管理該存儲空間的結構體,然后 fork 并監(jiān)控 child 進程。Child 進程在主線程的初始化的過程中,將前面打開的存儲文件整個 mmap 到內存中,此時創(chuàng)建并初始化空閑結構體,掛到存儲管理結構體,以待分配。Child 進程分配若干線程進行工作,主要包括一些管理線程和很多 worker 線程。
接著,開始真正的工作,varnish 的某個負責接收新 HTTP 連接線程開始等待用戶,如果有新的 HTTP 連接過來,它總負責接收,然后喚醒某個等待中的線程,并把具體的處理過程交給它。Worker 線程讀入 HTTP 請求的 URI,查找已有的 object,如果命中則直接返回并回復用戶。如果沒有命中,則需要將所請求的內容,從后端服務器中取過來,存到緩存中,然后再回復。
分配緩存的過程是這樣的:它根據所讀到 object 的大小,創(chuàng)建相應大小的緩存文件。為了讀寫方便,程序會把每個 object 的大小變?yōu)樽罱咏浯笮〉膬却骓撁姹稊?。然后從現有的空閑存儲結構體中查找,找到最合適的大小的空閑存儲塊,分配給它。如果空閑塊沒有用完,就把多余的內存另外組成一個空閑存儲塊,掛到管理結構體上。如果緩存已滿,就根據 LRU 機制,把最舊的 object 釋放掉。
釋放緩存的過程是這樣的:有一個超時線程,檢測緩存中所有 object 的生存期,如果超初設定的 TTL(Time To Live)沒有被訪問,就刪除之,并且釋放相應的結構體及存儲內存。注意釋放時會檢查該存儲內存塊前面或后面的空閑內存塊,如果前面或后面的空閑內存和該釋放內存是連續(xù)的,就將它們合并成更大一塊內存。
整個文件緩存的管理,沒有考慮文件與內存的關系,實際上是將所有的 object 都考慮是在內存中,如果系統(tǒng)內存不足,系統(tǒng)會自動將其換到 swap 空間,而不需要 varnish 程序去控制。
Varnish 安裝
下載 varnish 安裝包
建議下載最新穩(wěn)定版本(現在最新 varnish 版本為 3.0.2),varnish 提供源代碼安裝包和可執(zhí)行程序安裝包,按照您的習慣下載適合您平臺的任一安裝包即可。
安裝 varnish
源代碼安裝包安裝
首先安裝 pcre 庫,pcre 庫是為兼容正則表達式,如果不安裝,在安裝 varnish2.0 版本以上時,會提示找不到 pcre 庫。以下是 pcre 的安裝過程,其代碼如清單 1 所示:
清單 1. pcre 庫安裝代碼
tar zxvf pcre.tar.gz
cd pcre/
./configure --prefix=/usr/local/pcre/
Make && make install
安裝 varnish,其代碼如清單 2 所示:
清單 2. varnish 安裝代碼
tar xzvf varnish-3.0.2.tar.gz
cd varnish-3.0.2
export PKG_CONFIG_PATH =/usr/local/pcre/lib/pkgconfig
./configure --prefix=/usr/local/varnish
make
make install
可執(zhí)行程序安裝包安裝
RedHat 系統(tǒng)環(huán)境下的安裝 varnish,您需要安裝以下軟件:automake、autoconf、libtool、ncurses-devel、libxslt、groff、pcre-devel、pkgconfig,然后進行 varnish 的安裝,安裝代碼如清單 3 所示:
清單 3. varnish 安裝代碼
rpm -i varnish-2.1.4-2.el5.x86_64.rpm
啟動 varnish
清單 4. varnish 啟動代碼
varnishd -f /etc/varnish/default.vcl -s file,/var/varnish_cache,1G \
-T 127.0.0.1:2000 -a 0.0.0.0:9082
各參數的含義如下:
-f 指定 varnish 的配置文件位置
-s 指定 varnish 緩存存放的方式,常用的方式有:“-s file,<dir_or_file>,<size>”。
-T address:port 設定 varnish 的 telnet 管理地址及其端口
-a address:port 表示 varnish 對 http 的監(jiān)聽地址及其端口
Varnish 配置
VCL 簡介
VCL(varnish configuration language)是 varnish 配置語言,其用來定義 varnish 的存取策略。VCL 語法比較簡單,跟 C 和 Perl 比較相似。主要有以下幾點:
◦ 塊是由花括號分隔,語句以分號結束,使用‘ # '符號可以添加注釋。
◦ VCL 使用指定運算符“=”、比較運算符“==”、邏輯運算符“!,&&,!!”等形式,還支持正則表達式和用“~”進行 ACL 匹配運算。
◦ VCL 沒有用戶自己定義的變量,你可以在 backend、request 或 object 上設置變量值,采用 set 關鍵字進行設置。例如 set req.backend = director_employeeui;
◦ 兩個字符串的連接,他們之間沒有任何運算符。代碼如清單 5 所示:
清單 5. 字符串連接代碼
set req.http.X-hit = " hit" "it";
\”字符在 VCL 里沒有特別的含義,這點與其他語言略有不同。
◦ VCL 可以使用 set 關鍵字設置任何 HTTP 頭,可以使用 remove 或是 unset 關鍵字移除 HTTP 頭。
◦ VCL 有 if/else 的判斷語句,但是沒有循環(huán)語句。
VCL backend
聲明并初始化一個后端對象,代碼如清單 6 所示
清單 6. backend 聲明代碼
backend www {
.host = "www.example.com";
.port = "9082";
}
后端對象的使用,代碼如清單 7 所示
清單 7. backend 的使用代碼
if (req.http.host ~ "^(www.)?example.com$") {
set req.backend = www;
}
VCL 后端的集合 director
VCL 可以把多個 backends 聚合成一個組,這些組被叫做 director,這樣可以增強性能和彈力,當組里一個 backend 掛掉后,可以選擇另一個健康的 backend。VCL 有多種 director,不同的 director 采用不同的算法選擇 backend,主要有以下幾種:
◦ The random director
Random director 會根據所設置的權值(weight)來選擇 backend,.retries 參數表示嘗試找到一個 backend 的最大次數,.weight 參數表示權值
◦ The round-robin director
Round-robin director 在選擇 backend 時,會采用循環(huán)的方式依次選擇。
◦ The client director
Client director 根據 client.identity 來選擇 backend,您可以設置 client.identity 的值為 session cookie 來標識 backend。
backend probes
VCL 可以設置 probe 來檢測一個 backend 是否健康,定義一個 backend probes 代碼如清單 8 所示:
清單 8. 定義 backend probes 代碼
backend www {
.host = "www.example.com";
.port = "9082";
.probe = {
.url = "/test.jpg";// 哪個 url 需要 varnish 請求
.timeout = 1 s;// 等待多長時間超時
.interval = 5s// 檢查的時間間隔
.window = 5;// 維持 5 個 sliding window 的結果
.threshold = 3;// 至少有三次 window 是成功的,就宣告 backend 健康
}
}
ACL
ACL 可創(chuàng)建一個客戶端的訪問控制列表,你可以使用 ACL 控制哪些客戶端可以訪問,哪些客戶端禁止訪問。定義 ACL 代碼如清單 9 所示:
清單 9. ACL 定義代碼
Acl local{
"localhost";
"192.0.2.0"/24;
!"192.0.2.23";// 除去該 IP
}
VCL 內置函數
用于接收和處理請求。當請求到達并成功接收后被調用,通過判斷請求的數據來決定如何處理請求。例如如何響應、怎么響應、使用哪個后端服務器等。
此函數一般以如下幾個關鍵字結束。
pass:表示進入 pass 模式,把請求控制權交給 vcl_pass 函數。
pipe:表示進入 pipe 模式,把請求控制權交給 vcl_pipe 函數。
lookup:表示進入 lookup 模式,把請求控制權交給 lookup 指令處理,在緩存中查找被請求的對象,并且根據查找的結果把控制權交給函數 vcl_hit 或函數 vcl_miss。
error code [reason]:表示返回“code”給客戶端,并放棄處理該請求?!癱ode”是錯誤標識,例如 200 和 405 等?!皉eason”是錯誤提示信息。
vcl_pipe 函數
此函數在進入 pipe 模式時被調用,用于將請求直接傳遞至后端主機,在請求和返回的內容沒有改變的情況下,將不變的內容返回給客戶端,直到這個連接被關閉。
此函數一般以如下幾個關鍵字結束。
error code [reason]。
pipe。
vcl_pass 函數
此函數在進入 pass 模式時被調用,用于將請求直接傳遞至后端主機。后端主機在應答數據后將應答數據發(fā)送給客戶端,但不進行任何緩存,在當前連接下每次都返回最新的內容。
此函數一般以如下幾個關鍵字結束。
error code [reason]。
pass。
restart 重新啟動流程,增加啟動次數,如果重新啟動次數高于 max_restarts 發(fā)出一個錯誤警告
vcl_hash
當您想把一個數據添加到 hash 上時,調用此函數。
此函數一般以如下幾個關鍵字結束。
Hash。
vcl_hit 函數
在執(zhí)行 lookup 指令后,在緩存中找到請求的內容后將自動調用該函數。
此函數一般以如下幾個關鍵字結束。
deliver:表示將找到的內容發(fā)送給客戶端,并把控制權交給函數 vcl_deliver。
error code [reason] 。
pass。
restart 重新啟動流程,增加啟動次數,如果重新啟動次數高于 max_restarts 發(fā)出一個錯誤警告
vcl_miss 函數
在執(zhí)行 lookup 指令后,在緩存中沒有找到請求的內容時自動調用該方法。此函數可用于判斷是否需要從后端服務器獲取內容。
此函數一般以如下幾個關鍵字結束。
fetch:表示從后端獲取請求的內容,并把控制權交給 vcl_fetch 函數。
error code [reason] 。
pass。
vcl_fetch 函數
在后端主機更新緩存并且獲取內容后調用該方法,接著,通過判斷獲取的內容來決定是將內容放入緩存,還是直接返回給客戶端。
此函數一般以如下幾個關鍵字結束。
error code [reason]。
pass。
deliver。
esi。
restart 重新啟動流程,增加啟動次數,如果重新啟動次數高于 max_restarts 發(fā)出一個錯誤警告
vcl_deliver 函數
將在緩存中找到請求的內容發(fā)送給客戶端前調用此方法。
此函數一般以如下幾個關鍵字結束。
error code [reason]。
deliver。
restart 重新啟動流程,增加啟動次數,如果重新啟動次數高于 max_restarts 發(fā)出一個錯誤警告
vcl_error
出現錯誤時調用此函數。
此函數一般以如下幾個關鍵字結束。
deliver。
restart。
VCL 處理流程
VCL 處理的流程圖如圖 1 所示
圖 1.VCL 處理流程
Varnish 處理 HTTP 請求的過程大致分為如下幾個步驟。
◦ Receive 狀態(tài)(vcl_recv)。也就是請求處理的入口狀態(tài),根據 VCL 規(guī)則判斷該請求應該 pass(vcl_pass)或是 pipe(vcl_pipe),還是進入 lookup(本地查詢)。
◦ Lookup 狀態(tài)。進入該狀態(tài)后,會在 hash 表中查找數據,若找到,則進入 hit(vcl_hit)狀態(tài),否則進入 miss(vcl_miss)狀態(tài)。
◦ Pass(vcl_pass)狀態(tài)。在此狀態(tài)下,會直接進入后端請求,即進入 fetch(vcl_fetch)狀態(tài)
◦ Fetch(vcl_fetch)狀態(tài)。在 fetch 狀態(tài)下,對請求進行后端獲取,發(fā)送請求,獲得數據,并根據設置進行本地存儲。
◦ Deliver(vcl_deliver)狀態(tài)。將獲取到的數據發(fā)給客戶端,然后完成本次請求。
VCL 內置公共變量
VCL 內置的公共變量可以用在不同的 VCL 函數中,下面根據使用的不同階段進行介紹
當請求到達時,可以使用的公共變量表 1 所示
表 1. 請求到達時可用公共變量
公共變量名 | 含義 |
---|---|
req.backend | 指定對應的后端主機 |
server.ip | 表示服務器 IP |
client.ip | 表示客戶端 IP |
req.quest | 只是請求的類型,例如 GET、HEAD 等 |
req.url | 指定請求的地址 |
req.proto | 表示客戶端發(fā)起請求的 HTTP 協(xié)議版本 |
req.http.header | 表示對應請求中的 HTTP 頭部信息 |
req.restarts | 表示重啟次數,默認最大值為 4 |
Varnish 在向后端主機請求時,可是用的公共變量如表 2 所示
表 2. 向后端主機請求時可用公共變量
公共變量名 | 含義 |
---|---|
beresp.requset | 指定請求類型,例如 GET、HEAD 等 |
beresp.url | 表示請求地址 |
beresp.proto | 表示客戶端發(fā)起請求的 HTTP 協(xié)議版本 |
beresp.http.header | 表示對應請求中 HTTP 頭部信息 |
beresp.ttl | 表示緩存的生存周期,cache 保留時間(s) |
從 cache 或是后端主機獲取內容后,可以使用的公共變量如表 3 所示
表 3. 后端主機獲取內容時可使用公共變量
公共變量名 | 含義 |
---|---|
obj.status | 返回內容的請求狀態(tài)碼,例如 200、302、504 等 |
obj.cacheable | 返回的內容是否可以緩存 |
obj.valid | 是否有效的 HTTP 請求 |
obj.response | 返回內容的請求狀態(tài)信息 |
obj.proto | 返回內容的 HTTP 版本 |
obj.ttl | 返回內容的生存周期,也就是緩存時間,單位秒 |
obj.lastuse | 返回上一次請求到現在的時間間隔,單位秒 |
對客戶端應答時,可以使用的公共變量如表 4 所示
表 4. 對客戶端相應時可使用公共變量
公共變量名稱 | 含義 |
---|---|
resp.status | 返回給客戶端的 HTTP 代碼狀態(tài) |
resp.proto | 返回給客戶端的 HTTP 協(xié)議版本 |
resp.http.header | 返回給客戶端的 HTTP 頭部消息 |
resp.response | 返回給客戶端的 HTTP 頭部狀態(tài) |
VCL 調試
VCL 為配置文件語言,無法像 c/c++ 那樣進行單步調試,當 VCL 運行的效果和預期效果不一樣時,很難發(fā)現哪出現邏輯錯誤,這時除了查看代碼查找錯誤外,我們還可以采用內置 C 語言和瀏覽器查看返回對象中的狀態(tài)來查找邏輯的錯誤。
我們可以采用內置 C 語言來打印相應的信息,例如我們可以在相應的地方打印信息,來查看 VCL 流程的執(zhí)行是否正確。內置 C 語言打印信息代碼如清單 10 所示:
清單 10. 打印信息代碼
C{
#include<syslog.h>// 首先要包含頭文件
}C
C{
Syslog(LOG_INFO,"VCL run here in function xxx in line xxx");
}C
啟動 varnish 后,我們可以采用 tail -f /var/log/messages 命令在 /var/log/messages 中查看相應的打印信息。查看的打印信息如圖 2 所示:
圖 2. varnish 打印信息
我們還可以將某些變量的值設置到返回給瀏覽器的對象上,然后在瀏覽器中查看該變量的值。設置變量值代碼如清單 11 所示:
清單 11. varnish 變量設置代碼
set beresp.http.X-Cookie-Debug-req-cookie = req.http.Cookie;
在 chrome 瀏覽器中查看 beresp.http.X-Cookie-Debug-req-cookie 的值,結果如圖 3 所示:
圖 3. 在瀏覽器中查看 varnish 變量的值
相關文章
Apache加速模塊mod_pagespeed安裝使用詳細介紹
這篇文章主要介紹了Apache加速模塊mod_pagespeed安裝使用詳細介紹,需要的朋友可以參考下2014-03-03