欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Varnish配置文件詳解(架構(gòu)師之路)

 更新時(shí)間:2016年02月27日 21:26:53   投稿:mdxy-dxy  
這篇文章主要介紹了Varnish配置文件詳解(架構(gòu)師之路),需要的朋友可以參考下

既然Varnish需要在多臺(tái)服務(wù)器上緩存數(shù)據(jù),就需要Varnish映射所有的URL到一臺(tái)單獨(dú)的主機(jī)。

復(fù)制代碼 代碼如下:

backend webserver { 
.host = "127.0.0.1"; 
.port = "80"; 
.connect_timeout = 4s; 
.first_byte_timeout = 5s; 
.between_bytes_timeout = 20s; 


該塊配置用于定義一臺(tái)Varnish默認(rèn)訪問(wèn)的后端服務(wù)器,當(dāng)Varnish需要從后端服務(wù)器獲取數(shù)據(jù)時(shí),就會(huì)訪問(wèn)自己的80端口。

當(dāng)然Varnish也可以定義多臺(tái)后端服務(wù)器實(shí)現(xiàn)負(fù)載均衡的目的。

.connect_timeout定義的是等待連接后端的時(shí)間
.first_byte_timeout定義的是等待從backend傳輸過(guò)來(lái)的第一個(gè)字節(jié)的時(shí)間
.between_bytes_timeout 定義的是兩個(gè)字節(jié)的間隔時(shí)間

當(dāng)然還可以增加一個(gè)backend,用于訪問(wèn)本機(jī)的8090端口,假設(shè)通過(guò)該端口提供圖片服務(wù)。

復(fù)制代碼 代碼如下:

backend img { 
.host = "127.0.0.1"; 
.port = "8090"; 


 
當(dāng)匹配img的URL時(shí),需把請(qǐng)求發(fā)送到上面定義的backend img,其他的請(qǐng)求發(fā)送到backend webserver。
復(fù)制代碼 代碼如下:

sub vcl_recv { 
if (req.url ~ "^/img/") { 
set req.backend = img; 
} else { 
set req.backend = webserver. 


Varnish不僅僅可以定義多個(gè)backend,還可以把多個(gè)backend合成一個(gè)組,使用循環(huán)的方式把請(qǐng)求分配給組中的backends。并且Varnish會(huì)根據(jù)健康檢查情況來(lái)判斷后端服務(wù)器是否正常提供服務(wù)。
Varnish使用區(qū)域語(yǔ)言VCL來(lái)管理定義Varnish的存取策略。VCL語(yǔ)法簡(jiǎn)單,跟Perl比較相似,可以使用多種運(yùn)算符如"="、"=="、"!,&&,!!"等形式;也可以使用正則表達(dá)式來(lái)進(jìn)行匹配,還可以使用"set"來(lái)指定變量。當(dāng)執(zhí)行VCL時(shí),Varnish會(huì)先把VCL轉(zhuǎn)換成二進(jìn)制代碼。
有一點(diǎn)要注意,"\"字符在VCL里沒(méi)有什么特別的含義,這點(diǎn)和其他語(yǔ)言不同。另外,VCL只是配置語(yǔ)言,并不是真正的編程語(yǔ)言,所以沒(méi)有循環(huán)和自定義變量。

為了可以更好地對(duì)Varnish進(jìn)行配置調(diào)整,需要了解Varnish的配置語(yǔ)法,也就是VCL語(yǔ)言。下面對(duì)VCL常用的一些函數(shù)和變量進(jìn)行介紹。

(1)vcl_recv模塊

用于接收和處理請(qǐng)求。當(dāng)請(qǐng)求成功被調(diào)用后,Varnish通過(guò)判斷請(qǐng)求的數(shù)據(jù)來(lái)決定如何處理請(qǐng)求。此模塊一般以如下幾個(gè)關(guān)鍵字結(jié)束。

pass:表示進(jìn)入pass模式,把請(qǐng)求交給vcl_pass模塊處理。
pipe:表示進(jìn)入pipe模式,把請(qǐng)求交給vcl_pipe模塊處理。
error code [reason]:表示把錯(cuò)誤標(biāo)識(shí)返回給客戶端,并放棄處理該請(qǐng)求。錯(cuò)誤標(biāo)識(shí)包括200、405等。"reason"是對(duì)錯(cuò)誤的提示信息。

(2)vcl_pipe模塊

此模塊在請(qǐng)求進(jìn)入pipe模式時(shí)被調(diào)用,用于將請(qǐng)求直接傳遞至后端主機(jī),在請(qǐng)求和返回的內(nèi)容沒(méi)有改變的情況下,也就是在當(dāng)前連接未關(guān)閉時(shí),服務(wù)器將不變的內(nèi)容返回給客戶端,直到該連接被關(guān)閉。

(3)vcl_pass模塊

此模塊表示當(dāng)請(qǐng)求被pass后,用于將請(qǐng)求直接傳遞至后端應(yīng)用服務(wù)器。后端應(yīng)用服務(wù)器在接收請(qǐng)求后將數(shù)據(jù)發(fā)送給客戶端,但不進(jìn)行任何數(shù)據(jù)的緩存,在當(dāng)前連接下每次都返回最新的內(nèi)容。

(4)lookup

一個(gè)請(qǐng)求在vcl_recv中被lookup后,Varnish將在緩存中提取數(shù)據(jù)。如果緩存中有相應(yīng)的數(shù)據(jù),就把控制權(quán)交給vcl_hit模塊;如果緩存中沒(méi)有相應(yīng)的數(shù)據(jù),請(qǐng)求將被設(shè)置為pass并將其交給vcl_miss模塊。

(5)vcl_hit模塊

執(zhí)行l(wèi)ookup指令后,Varnish在緩存中找到請(qǐng)求的內(nèi)容后將自動(dòng)調(diào)用該模塊。

在此模塊中,deliver表示將找到的數(shù)據(jù)發(fā)送給客戶端,并把控制權(quán)交給vcl_deliver模塊。

(6)vcl_miss模塊

執(zhí)行l(wèi)ookup后,Varnish在緩存中沒(méi)有找到請(qǐng)求的內(nèi)容時(shí)會(huì)自動(dòng)調(diào)用該方法。此模塊可以用于判斷是否需要從后端服務(wù)器獲取內(nèi)容。

在此模塊中,fetch表示從后端獲取請(qǐng)求的數(shù)據(jù),并把控制權(quán)交給vcl_fetch模塊。

(7)vcl_fetch模塊

在后端主機(jī)更新緩存并且獲取內(nèi)容后調(diào)用該方法,接著,通過(guò)判斷獲取的內(nèi)容來(lái)決定是將內(nèi)容放入緩存,還是直接返回給客戶端。

(8)vcl_deliver模塊

當(dāng)一個(gè)沒(méi)有被緩存的數(shù)據(jù)交付給客戶端的時(shí)候被調(diào)用。

(9)vcl_timeout 模塊

在緩存數(shù)據(jù)到期前調(diào)用此模塊。

在此模塊中,discard表示從緩存中清除到期數(shù)據(jù)。

(10)vcl_discard模塊

在緩存數(shù)據(jù)到期后或緩存空間不夠時(shí),自動(dòng)調(diào)用該模塊。

在此模塊中keep表示將數(shù)據(jù)繼續(xù)保留在緩存中。

復(fù)制代碼 代碼如下:

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); 
       } 

這兩個(gè)規(guī)則定義了允許哪些主機(jī)通過(guò)HTTP來(lái)執(zhí)行PURG進(jìn)行緩存刪除。如果不是指定的IP,就會(huì)出現(xiàn)HTTP 405錯(cuò)誤,提示Not allowed錯(cuò)誤字樣。

復(fù)制代碼 代碼如下:

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); 
     } 

這段條件判斷用于對(duì)aaa.com域名進(jìn)行緩存加速,aaa.com是泛指概念,也就是說(shuō)所有以aaa.com結(jié)尾的域名都進(jìn)行緩存。而if (req.request != "GET" && req.request != "HEAD") 表示"如果請(qǐng)求的類(lèi)型不是GET與HEAD",則返回錯(cuò)誤碼404。

復(fù)制代碼 代碼如下:

if (req.url ~ "^/images") { 
  unset req.http.cookie; 
 } 

這條規(guī)則的意思是清除服務(wù)器上/images目錄下的所有緩存,當(dāng)這個(gè)請(qǐng)求在后端服務(wù)器生效時(shí),如果訪問(wèn)的URL匹配這個(gè)規(guī)則,那么頭信息中的cookie就會(huì)被刪除。

復(fù)制代碼 代碼如下:

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; } 


因?yàn)镾quid、Varnish都會(huì)把客戶端的IP地址放在HTTP_X_FORWARDED_FOR里面?zhèn)鹘o后端的Web服務(wù)器,所以后端的Web程序都要對(duì)其進(jìn)行調(diào)用。

復(fù)制代碼 代碼如下:

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判斷表示如果請(qǐng)求的類(lèi)型不是GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE時(shí),則進(jìn)入pipe模式。注意這里的"&&"是與的關(guān)系。

復(fù)制代碼 代碼如下:

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判斷用于對(duì)請(qǐng)求類(lèi)型是GET,并且請(qǐng)求的URL以png、swf、txt、gif、css、js等結(jié)尾時(shí),則進(jìn)行緩存,緩存時(shí)間為180秒。其他緩存為30天。
復(fù)制代碼 代碼如下:

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"; 
 } 

 
這個(gè)模塊定義的是添加一個(gè)Header標(biāo)識(shí),以判斷緩存是否命中。
復(fù)制代碼 代碼如下:

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); 

最后這個(gè)模塊定義了訪問(wèn)錯(cuò)誤頁(yè)面時(shí)的返回信息。

現(xiàn)在varnish配置基本完成,可以在8080端口上啟動(dòng)varnish,并進(jìn)行一些基本的測(cè)試。

Varnish緩存的配置

簡(jiǎn)單的配置文件內(nèi)容如下:

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 簡(jiǎn)介

Varnish 是一款高性能且開(kāi)源的反向代理服務(wù)器和 HTTP 加速器,其采用全新的軟件體系機(jī)構(gòu),和現(xiàn)在的硬件體系緊密配合,與傳統(tǒng)的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優(yōu)點(diǎn),很多大型的網(wǎng)站都開(kāi)始嘗試使用 varnish 來(lái)替換 squid,這些都促進(jìn) varnish 迅速發(fā)展起來(lái)。
挪威的最大的在線報(bào)紙 Verdens Gang(vg.no) 使用 3 臺(tái) Varnish 代替了原來(lái)的 12 臺(tái) Squid,性能比以前更好,這是 Varnish 最成功的應(yīng)用案例。


Varnish 文件緩存的工作流程

Varnish 與一般服務(wù)器軟件類(lèi)似,分為 master 進(jìn)程和 child 進(jìn)程。Master 進(jìn)程讀入存儲(chǔ)配置文件,調(diào)用合適的存儲(chǔ)類(lèi)型,然后創(chuàng)建 / 讀入相應(yīng)大小的緩存文件,接著 master 初始化管理該存儲(chǔ)空間的結(jié)構(gòu)體,然后 fork 并監(jiān)控 child 進(jìn)程。Child 進(jìn)程在主線程的初始化的過(guò)程中,將前面打開(kāi)的存儲(chǔ)文件整個(gè) mmap 到內(nèi)存中,此時(shí)創(chuàng)建并初始化空閑結(jié)構(gòu)體,掛到存儲(chǔ)管理結(jié)構(gòu)體,以待分配。Child 進(jìn)程分配若干線程進(jìn)行工作,主要包括一些管理線程和很多 worker 線程。
接著,開(kāi)始真正的工作,varnish 的某個(gè)負(fù)責(zé)接收新 HTTP 連接線程開(kāi)始等待用戶,如果有新的 HTTP 連接過(guò)來(lái),它總負(fù)責(zé)接收,然后喚醒某個(gè)等待中的線程,并把具體的處理過(guò)程交給它。Worker 線程讀入 HTTP 請(qǐng)求的 URI,查找已有的 object,如果命中則直接返回并回復(fù)用戶。如果沒(méi)有命中,則需要將所請(qǐng)求的內(nèi)容,從后端服務(wù)器中取過(guò)來(lái),存到緩存中,然后再回復(fù)。
分配緩存的過(guò)程是這樣的:它根據(jù)所讀到 object 的大小,創(chuàng)建相應(yīng)大小的緩存文件。為了讀寫(xiě)方便,程序會(huì)把每個(gè) object 的大小變?yōu)樽罱咏浯笮〉膬?nèi)存頁(yè)面倍數(shù)。然后從現(xiàn)有的空閑存儲(chǔ)結(jié)構(gòu)體中查找,找到最合適的大小的空閑存儲(chǔ)塊,分配給它。如果空閑塊沒(méi)有用完,就把多余的內(nèi)存另外組成一個(gè)空閑存儲(chǔ)塊,掛到管理結(jié)構(gòu)體上。如果緩存已滿,就根據(jù) LRU 機(jī)制,把最舊的 object 釋放掉。
釋放緩存的過(guò)程是這樣的:有一個(gè)超時(shí)線程,檢測(cè)緩存中所有 object 的生存期,如果超初設(shè)定的 TTL(Time To Live)沒(méi)有被訪問(wèn),就刪除之,并且釋放相應(yīng)的結(jié)構(gòu)體及存儲(chǔ)內(nèi)存。注意釋放時(shí)會(huì)檢查該存儲(chǔ)內(nèi)存塊前面或后面的空閑內(nèi)存塊,如果前面或后面的空閑內(nèi)存和該釋放內(nèi)存是連續(xù)的,就將它們合并成更大一塊內(nèi)存。
整個(gè)文件緩存的管理,沒(méi)有考慮文件與內(nèi)存的關(guān)系,實(shí)際上是將所有的 object 都考慮是在內(nèi)存中,如果系統(tǒng)內(nèi)存不足,系統(tǒng)會(huì)自動(dòng)將其換到 swap 空間,而不需要 varnish 程序去控制。

Varnish 安裝

下載 varnish 安裝包

建議下載最新穩(wěn)定版本(現(xiàn)在最新 varnish 版本為 3.0.2),varnish 提供源代碼安裝包和可執(zhí)行程序安裝包,按照您的習(xí)慣下載適合您平臺(tái)的任一安裝包即可。

安裝 varnish

源代碼安裝包安裝

首先安裝 pcre 庫(kù),pcre 庫(kù)是為兼容正則表達(dá)式,如果不安裝,在安裝 varnish2.0 版本以上時(shí),會(huì)提示找不到 pcre 庫(kù)。以下是 pcre 的安裝過(guò)程,其代碼如清單 1 所示:

清單 1. pcre 庫(kù)安裝代碼

復(fù)制代碼 代碼如下:

tar zxvf pcre.tar.gz
     cd pcre/
     ./configure --prefix=/usr/local/pcre/
     Make && make install

安裝 varnish,其代碼如清單 2 所示:

清單 2. varnish 安裝代碼

復(fù)制代碼 代碼如下:

 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,然后進(jìn)行 varnish 的安裝,安裝代碼如清單 3 所示:

清單 3. varnish 安裝代碼

復(fù)制代碼 代碼如下:
   
 rpm -i varnish-2.1.4-2.el5.x86_64.rpm

啟動(dòng) varnish

清單 4. varnish 啟動(dòng)代碼

復(fù)制代碼 代碼如下:
   
 varnishd -f /etc/varnish/default.vcl -s file,/var/varnish_cache,1G \
 -T 127.0.0.1:2000 -a 0.0.0.0:9082

各參數(shù)的含義如下:

-f 指定 varnish 的配置文件位置
-s 指定 varnish 緩存存放的方式,常用的方式有:“-s file,<dir_or_file>,<size>”。
-T address:port 設(shè)定 varnish 的 telnet 管理地址及其端口
-a address:port 表示 varnish 對(duì) http 的監(jiān)聽(tīng)地址及其端口

Varnish 配置

VCL 簡(jiǎn)介

VCL(varnish configuration language)是 varnish 配置語(yǔ)言,其用來(lái)定義 varnish 的存取策略。VCL 語(yǔ)法比較簡(jiǎn)單,跟 C 和 Perl 比較相似。主要有以下幾點(diǎn):
◦ 塊是由花括號(hào)分隔,語(yǔ)句以分號(hào)結(jié)束,使用‘ # '符號(hào)可以添加注釋。
◦ VCL 使用指定運(yùn)算符“=”、比較運(yùn)算符“==”、邏輯運(yùn)算符“!,&&,!!”等形式,還支持正則表達(dá)式和用“~”進(jìn)行 ACL 匹配運(yùn)算。
◦ VCL 沒(méi)有用戶自己定義的變量,你可以在 backend、request 或 object 上設(shè)置變量值,采用 set 關(guān)鍵字進(jìn)行設(shè)置。例如 set req.backend = director_employeeui;
◦ 兩個(gè)字符串的連接,他們之間沒(méi)有任何運(yùn)算符。代碼如清單 5 所示:

清單 5. 字符串連接代碼

復(fù)制代碼 代碼如下:
    
 set req.http.X-hit = " hit" "it";

\”字符在 VCL 里沒(méi)有特別的含義,這點(diǎn)與其他語(yǔ)言略有不同。
◦ VCL 可以使用 set 關(guān)鍵字設(shè)置任何 HTTP 頭,可以使用 remove 或是 unset 關(guān)鍵字移除 HTTP 頭。
◦ VCL 有 if/else 的判斷語(yǔ)句,但是沒(méi)有循環(huán)語(yǔ)句。

VCL backend

聲明并初始化一個(gè)后端對(duì)象,代碼如清單 6 所示

清單 6. backend 聲明代碼

復(fù)制代碼 代碼如下:
   
  backend www {
    .host = "www.example.com";
    .port = "9082";
  }

后端對(duì)象的使用,代碼如清單 7 所示

清單 7. backend 的使用代碼

復(fù)制代碼 代碼如下:
   
  if (req.http.host ~ "^(www.)?example.com$") { 
     set req.backend = www;
  }

VCL 后端的集合 director

VCL 可以把多個(gè) backends 聚合成一個(gè)組,這些組被叫做 director,這樣可以增強(qiáng)性能和彈力,當(dāng)組里一個(gè) backend 掛掉后,可以選擇另一個(gè)健康的 backend。VCL 有多種 director,不同的 director 采用不同的算法選擇 backend,主要有以下幾種:
◦ The random director

Random director 會(huì)根據(jù)所設(shè)置的權(quán)值(weight)來(lái)選擇 backend,.retries 參數(shù)表示嘗試找到一個(gè) backend 的最大次數(shù),.weight 參數(shù)表示權(quán)值
◦ The round-robin director

Round-robin director 在選擇 backend 時(shí),會(huì)采用循環(huán)的方式依次選擇。
◦ The client director

Client director 根據(jù) client.identity 來(lái)選擇 backend,您可以設(shè)置 client.identity 的值為 session cookie 來(lái)標(biāo)識(shí) backend。

backend probes

VCL 可以設(shè)置 probe 來(lái)檢測(cè)一個(gè) backend 是否健康,定義一個(gè) backend probes 代碼如清單 8 所示:

清單 8. 定義 backend probes 代碼

復(fù)制代碼 代碼如下:

backend www {
   .host = "www.example.com";
   .port = "9082";
   .probe = {
     .url = "/test.jpg";// 哪個(gè) url 需要 varnish 請(qǐng)求
     .timeout = 1 s;// 等待多長(zhǎng)時(shí)間超時(shí)
     .interval = 5s// 檢查的時(shí)間間隔
             .window = 5;// 維持 5 個(gè) sliding window 的結(jié)果
     .threshold = 3;// 至少有三次 window 是成功的,就宣告 backend 健康
   }
  }

ACL

ACL 可創(chuàng)建一個(gè)客戶端的訪問(wèn)控制列表,你可以使用 ACL 控制哪些客戶端可以訪問(wèn),哪些客戶端禁止訪問(wèn)。定義 ACL 代碼如清單 9 所示:

清單 9. ACL 定義代碼

復(fù)制代碼 代碼如下:
   
  Acl local{
    "localhost";
    "192.0.2.0"/24;
    !"192.0.2.23";// 除去該 IP
  }

VCL 內(nèi)置函數(shù)

用于接收和處理請(qǐng)求。當(dāng)請(qǐng)求到達(dá)并成功接收后被調(diào)用,通過(guò)判斷請(qǐng)求的數(shù)據(jù)來(lái)決定如何處理請(qǐng)求。例如如何響應(yīng)、怎么響應(yīng)、使用哪個(gè)后端服務(wù)器等。

此函數(shù)一般以如下幾個(gè)關(guān)鍵字結(jié)束。

pass:表示進(jìn)入 pass 模式,把請(qǐng)求控制權(quán)交給 vcl_pass 函數(shù)。
pipe:表示進(jìn)入 pipe 模式,把請(qǐng)求控制權(quán)交給 vcl_pipe 函數(shù)。

lookup:表示進(jìn)入 lookup 模式,把請(qǐng)求控制權(quán)交給 lookup 指令處理,在緩存中查找被請(qǐng)求的對(duì)象,并且根據(jù)查找的結(jié)果把控制權(quán)交給函數(shù) vcl_hit 或函數(shù) vcl_miss。

error code [reason]:表示返回“code”給客戶端,并放棄處理該請(qǐng)求?!癱ode”是錯(cuò)誤標(biāo)識(shí),例如 200 和 405 等?!皉eason”是錯(cuò)誤提示信息。

vcl_pipe 函數(shù)

此函數(shù)在進(jìn)入 pipe 模式時(shí)被調(diào)用,用于將請(qǐng)求直接傳遞至后端主機(jī),在請(qǐng)求和返回的內(nèi)容沒(méi)有改變的情況下,將不變的內(nèi)容返回給客戶端,直到這個(gè)連接被關(guān)閉。

此函數(shù)一般以如下幾個(gè)關(guān)鍵字結(jié)束。

error code [reason]。

pipe。

vcl_pass 函數(shù)

此函數(shù)在進(jìn)入 pass 模式時(shí)被調(diào)用,用于將請(qǐng)求直接傳遞至后端主機(jī)。后端主機(jī)在應(yīng)答數(shù)據(jù)后將應(yīng)答數(shù)據(jù)發(fā)送給客戶端,但不進(jìn)行任何緩存,在當(dāng)前連接下每次都返回最新的內(nèi)容。

此函數(shù)一般以如下幾個(gè)關(guān)鍵字結(jié)束。

error code [reason]。

pass。

restart 重新啟動(dòng)流程,增加啟動(dòng)次數(shù),如果重新啟動(dòng)次數(shù)高于 max_restarts 發(fā)出一個(gè)錯(cuò)誤警告

vcl_hash

當(dāng)您想把一個(gè)數(shù)據(jù)添加到 hash 上時(shí),調(diào)用此函數(shù)。

此函數(shù)一般以如下幾個(gè)關(guān)鍵字結(jié)束。

Hash。

vcl_hit 函數(shù)

在執(zhí)行 lookup 指令后,在緩存中找到請(qǐng)求的內(nèi)容后將自動(dòng)調(diào)用該函數(shù)。

此函數(shù)一般以如下幾個(gè)關(guān)鍵字結(jié)束。

deliver:表示將找到的內(nèi)容發(fā)送給客戶端,并把控制權(quán)交給函數(shù) vcl_deliver。

error code [reason] 。

pass。

restart 重新啟動(dòng)流程,增加啟動(dòng)次數(shù),如果重新啟動(dòng)次數(shù)高于 max_restarts 發(fā)出一個(gè)錯(cuò)誤警告

vcl_miss 函數(shù)

在執(zhí)行 lookup 指令后,在緩存中沒(méi)有找到請(qǐng)求的內(nèi)容時(shí)自動(dòng)調(diào)用該方法。此函數(shù)可用于判斷是否需要從后端服務(wù)器獲取內(nèi)容。

此函數(shù)一般以如下幾個(gè)關(guān)鍵字結(jié)束。

fetch:表示從后端獲取請(qǐng)求的內(nèi)容,并把控制權(quán)交給 vcl_fetch 函數(shù)。

error code [reason] 。

pass。

vcl_fetch 函數(shù)

在后端主機(jī)更新緩存并且獲取內(nèi)容后調(diào)用該方法,接著,通過(guò)判斷獲取的內(nèi)容來(lái)決定是將內(nèi)容放入緩存,還是直接返回給客戶端。

此函數(shù)一般以如下幾個(gè)關(guān)鍵字結(jié)束。

error code [reason]。

pass。

deliver。

esi。

restart 重新啟動(dòng)流程,增加啟動(dòng)次數(shù),如果重新啟動(dòng)次數(shù)高于 max_restarts 發(fā)出一個(gè)錯(cuò)誤警告

vcl_deliver 函數(shù)

將在緩存中找到請(qǐng)求的內(nèi)容發(fā)送給客戶端前調(diào)用此方法。

此函數(shù)一般以如下幾個(gè)關(guān)鍵字結(jié)束。

error code [reason]。

deliver。

restart 重新啟動(dòng)流程,增加啟動(dòng)次數(shù),如果重新啟動(dòng)次數(shù)高于 max_restarts 發(fā)出一個(gè)錯(cuò)誤警告

vcl_error

出現(xiàn)錯(cuò)誤時(shí)調(diào)用此函數(shù)。

此函數(shù)一般以如下幾個(gè)關(guān)鍵字結(jié)束。

deliver。

restart。

VCL 處理流程

VCL 處理的流程圖如圖 1 所示

圖 1.VCL 處理流程

Varnish 處理 HTTP 請(qǐng)求的過(guò)程大致分為如下幾個(gè)步驟。

◦ Receive 狀態(tài)(vcl_recv)。也就是請(qǐng)求處理的入口狀態(tài),根據(jù) VCL 規(guī)則判斷該請(qǐng)求應(yīng)該 pass(vcl_pass)或是 pipe(vcl_pipe),還是進(jìn)入 lookup(本地查詢)。
◦ Lookup 狀態(tài)。進(jìn)入該狀態(tài)后,會(huì)在 hash 表中查找數(shù)據(jù),若找到,則進(jìn)入 hit(vcl_hit)狀態(tài),否則進(jìn)入 miss(vcl_miss)狀態(tài)。
◦ Pass(vcl_pass)狀態(tài)。在此狀態(tài)下,會(huì)直接進(jìn)入后端請(qǐng)求,即進(jìn)入 fetch(vcl_fetch)狀態(tài)
◦ Fetch(vcl_fetch)狀態(tài)。在 fetch 狀態(tài)下,對(duì)請(qǐng)求進(jìn)行后端獲取,發(fā)送請(qǐng)求,獲得數(shù)據(jù),并根據(jù)設(shè)置進(jìn)行本地存儲(chǔ)。
◦ Deliver(vcl_deliver)狀態(tài)。將獲取到的數(shù)據(jù)發(fā)給客戶端,然后完成本次請(qǐng)求。

VCL 內(nèi)置公共變量

VCL 內(nèi)置的公共變量可以用在不同的 VCL 函數(shù)中,下面根據(jù)使用的不同階段進(jìn)行介紹
當(dāng)請(qǐng)求到達(dá)時(shí),可以使用的公共變量表 1 所示

表 1. 請(qǐng)求到達(dá)時(shí)可用公共變量

公共變量名 含義
req.backend 指定對(duì)應(yīng)的后端主機(jī)
server.ip 表示服務(wù)器 IP
client.ip 表示客戶端 IP
req.quest 只是請(qǐng)求的類(lèi)型,例如 GET、HEAD 等
req.url 指定請(qǐng)求的地址
req.proto 表示客戶端發(fā)起請(qǐng)求的 HTTP 協(xié)議版本
req.http.header 表示對(duì)應(yīng)請(qǐng)求中的 HTTP 頭部信息
req.restarts 表示重啟次數(shù),默認(rèn)最大值為 4

Varnish 在向后端主機(jī)請(qǐng)求時(shí),可是用的公共變量如表 2 所示

表 2. 向后端主機(jī)請(qǐng)求時(shí)可用公共變量

公共變量名 含義
beresp.requset 指定請(qǐng)求類(lèi)型,例如 GET、HEAD 等
beresp.url 表示請(qǐng)求地址
beresp.proto 表示客戶端發(fā)起請(qǐng)求的 HTTP 協(xié)議版本
beresp.http.header 表示對(duì)應(yīng)請(qǐng)求中 HTTP 頭部信息
beresp.ttl 表示緩存的生存周期,cache 保留時(shí)間(s)

從 cache 或是后端主機(jī)獲取內(nèi)容后,可以使用的公共變量如表 3 所示

表 3. 后端主機(jī)獲取內(nèi)容時(shí)可使用公共變量

公共變量名 含義
obj.status 返回內(nèi)容的請(qǐng)求狀態(tài)碼,例如 200、302、504 等
obj.cacheable 返回的內(nèi)容是否可以緩存
obj.valid 是否有效的 HTTP 請(qǐng)求
obj.response 返回內(nèi)容的請(qǐng)求狀態(tài)信息
obj.proto 返回內(nèi)容的 HTTP 版本
obj.ttl 返回內(nèi)容的生存周期,也就是緩存時(shí)間,單位秒
obj.lastuse 返回上一次請(qǐng)求到現(xiàn)在的時(shí)間間隔,單位秒

對(duì)客戶端應(yīng)答時(shí),可以使用的公共變量如表 4 所示

表 4. 對(duì)客戶端相應(yīng)時(shí)可使用公共變量

公共變量名稱 含義
resp.status 返回給客戶端的 HTTP 代碼狀態(tài)
resp.proto 返回給客戶端的 HTTP 協(xié)議版本
resp.http.header 返回給客戶端的 HTTP 頭部消息
resp.response 返回給客戶端的 HTTP 頭部狀態(tài)

VCL 調(diào)試

VCL 為配置文件語(yǔ)言,無(wú)法像 c/c++ 那樣進(jìn)行單步調(diào)試,當(dāng) VCL 運(yùn)行的效果和預(yù)期效果不一樣時(shí),很難發(fā)現(xiàn)哪出現(xiàn)邏輯錯(cuò)誤,這時(shí)除了查看代碼查找錯(cuò)誤外,我們還可以采用內(nèi)置 C 語(yǔ)言和瀏覽器查看返回對(duì)象中的狀態(tài)來(lái)查找邏輯的錯(cuò)誤。
我們可以采用內(nèi)置 C 語(yǔ)言來(lái)打印相應(yīng)的信息,例如我們可以在相應(yīng)的地方打印信息,來(lái)查看 VCL 流程的執(zhí)行是否正確。內(nèi)置 C 語(yǔ)言打印信息代碼如清單 10 所示:

清單 10. 打印信息代碼

復(fù)制代碼 代碼如下:

  C{
     #include<syslog.h>// 首先要包含頭文件
      }C
      C{
     Syslog(LOG_INFO,"VCL run here in function xxx in line xxx");
      }C

啟動(dòng) varnish 后,我們可以采用 tail -f /var/log/messages 命令在 /var/log/messages 中查看相應(yīng)的打印信息。查看的打印信息如圖 2 所示:

圖 2. varnish 打印信息

我們還可以將某些變量的值設(shè)置到返回給瀏覽器的對(duì)象上,然后在瀏覽器中查看該變量的值。設(shè)置變量值代碼如清單 11 所示:

清單 11. varnish 變量設(shè)置代碼

復(fù)制代碼 代碼如下:
    
 set beresp.http.X-Cookie-Debug-req-cookie = req.http.Cookie;

在 chrome 瀏覽器中查看 beresp.http.X-Cookie-Debug-req-cookie 的值,結(jié)果如圖 3 所示:

圖 3. 在瀏覽器中查看 varnish 變量的值

相關(guān)文章

  • Apache加速模塊mod_pagespeed安裝使用詳細(xì)介紹

    Apache加速模塊mod_pagespeed安裝使用詳細(xì)介紹

    這篇文章主要介紹了Apache加速模塊mod_pagespeed安裝使用詳細(xì)介紹,需要的朋友可以參考下
    2014-03-03
  • ubuntu下用dpkg命令行運(yùn)行deb安裝包的方法

    ubuntu下用dpkg命令行運(yùn)行deb安裝包的方法

    在Ubuntu系統(tǒng)中,除了通過(guò)桌面啟動(dòng)deb安裝包外,還能通過(guò)命令行來(lái)運(yùn)行deb安裝包,需要使用到dpkg命令,下面這篇文中就給大家介紹下Ubuntu下使用dpkg命令運(yùn)行deb安裝包的方法,需要的朋友可以參考借鑒,一起來(lái)學(xué)習(xí)下吧。
    2017-01-01
  • Linux桌面的4種掃描工具

    Linux桌面的4種掃描工具

    今天小編就為大家分享一篇關(guān)于Linux桌面的4種掃描工具的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • 淺談Linux進(jìn)程間通信方式及優(yōu)缺點(diǎn)

    淺談Linux進(jìn)程間通信方式及優(yōu)缺點(diǎn)

    這篇文章主要介紹了淺談Linux進(jìn)程間通信方式及優(yōu)缺點(diǎn),具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Linux下卸載MySQL8.0版本的操作方法

    Linux下卸載MySQL8.0版本的操作方法

    在本篇文章中小編給各位整理的是關(guān)于Linux下卸載MySQL8.0版本的操作步驟和方法,有需要的朋友們學(xué)習(xí)下。
    2019-11-11
  • VMware下Centos7橋接方式網(wǎng)絡(luò)配置步驟詳解

    VMware下Centos7橋接方式網(wǎng)絡(luò)配置步驟詳解

    這篇文章主要為大家詳細(xì)介紹了VMware下Centos7橋接方式網(wǎng)絡(luò)配置完整步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • linux的硬鏈接和軟連接的區(qū)別及說(shuō)明

    linux的硬鏈接和軟連接的區(qū)別及說(shuō)明

    這篇文章主要介紹了linux的硬鏈接和軟連接的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Linux 常用命令操作大全(推薦收藏)

    Linux 常用命令操作大全(推薦收藏)

    這篇文章主要介紹了Linux 常用命令操作大全,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解Ubuntu16.04啟動(dòng)器圖標(biāo)異常解決方法

    詳解Ubuntu16.04啟動(dòng)器圖標(biāo)異常解決方法

    本篇文章主要介紹了詳解Ubuntu16.04啟動(dòng)器圖標(biāo)異常解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • CentOS7下實(shí)現(xiàn)終端輸入中文設(shè)置詳解

    CentOS7下實(shí)現(xiàn)終端輸入中文設(shè)置詳解

    這篇文章主要給大家介紹了關(guān)于CentOS7下實(shí)現(xiàn)終端輸入中文設(shè)置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用CentOS7系統(tǒng)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評(píng)論