亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

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

2024-09-01 13:47:43
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了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傳輸過來的第一個字節的時間
.between_bytes_timeout 定義的是兩個字節的間隔時間

當然還可以增加一個backend,用于訪問本機的8090端口,假設通過該端口提供圖片服務。

 

復制代碼代碼如下:

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

 
當匹配img的URL時,需把請求發送到上面定義的backend img,其他的請求發送到backend webserver。 
復制代碼代碼如下:

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

 

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

為了可以更好地對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后,用于將請求直接傳遞至后端應用服務器。后端應用服務器在接收請求后將數據發送給客戶端,但不進行任何數據的緩存,在當前連接下每次都返回最新的內容。

(4)lookup

一個請求在vcl_recv中被lookup后,Varnish將在緩存中提取數據。如果緩存中有相應的數據,就把控制權交給vcl_hit模塊;如果緩存中沒有相應的數據,請求將被設置為pass并將其交給vcl_miss模塊。

(5)vcl_hit模塊

執行lookup指令后,Varnish在緩存中找到請求的內容后將自動調用該模塊。

在此模塊中,deliver表示將找到的數據發送給客戶端,并把控制權交給vcl_deliver模塊。

(6)vcl_miss模塊

執行lookup后,Varnish在緩存中沒有找到請求的內容時會自動調用該方法。此模塊可以用于判斷是否需要從后端服務器獲取內容。

在此模塊中,fetch表示從后端獲取請求的數據,并把控制權交給vcl_fetch模塊。

(7)vcl_fetch模塊

在后端主機更新緩存并且獲取內容后調用該方法,接著,通過判斷獲取的內容來決定是將內容放入緩存,還是直接返回給客戶端。

(8)vcl_deliver模塊

當一個沒有被緩存的數據交付給客戶端的時候被調用。

(9)vcl_timeout 模塊

在緩存數據到期前調用此模塊。

在此模塊中,discard表示從緩存中清除到期數據。

(10)vcl_discard模塊

在緩存數據到期后或緩存空間不夠時,自動調用該模塊。

在此模塊中keep表示將數據繼續保留在緩存中。

 

復制代碼代碼如下:

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

 

這兩個規則定義了允許哪些主機通過HTTP來執行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;  
 }  

這條規則的意思是清除服務器上/images目錄下的所有緩存,當這個請求在后端服務器生效時,如果訪問的URL匹配這個規則,那么頭信息中的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里面傳給后端的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 href="http://read.easou.com/">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 href="http://read.easou.com/">read.easou.com</a>    </address>   </body> </html> "};  return (deliver); } 

Varnish 簡介

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


Varnish 文件緩存的工作流程

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

Varnish 安裝

下載 varnish 安裝包

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

安裝 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 

 

可執行程序安裝包安裝
 
RedHat 系統環境下的安裝 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 的監聽地址及其端口

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 的判斷語句,但是沒有循環語句。

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 時,會采用循環的方式依次選擇。
? 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 可創建一個客戶端的訪問控制列表,你可以使用 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”給客戶端,并放棄處理該請求。“code”是錯誤標識,例如 200 和 405 等。“reason”是錯誤提示信息。

vcl_pipe 函數

此函數在進入 pipe 模式時被調用,用于將請求直接傳遞至后端主機,在請求和返回的內容沒有改變的情況下,將不變的內容返回給客戶端,直到這個連接被關閉。

此函數一般以如下幾個關鍵字結束。

error code [reason]。

pipe。

vcl_pass 函數

此函數在進入 pass 模式時被調用,用于將請求直接傳遞至后端主機。后端主機在應答數據后將應答數據發送給客戶端,但不進行任何緩存,在當前連接下每次都返回最新的內容。

此函數一般以如下幾個關鍵字結束。

error code [reason]。

pass。

restart 重新啟動流程,增加啟動次數,如果重新啟動次數高于 max_restarts 發出一個錯誤警告

vcl_hash

當您想把一個數據添加到 hash 上時,調用此函數。

此函數一般以如下幾個關鍵字結束。

Hash。

vcl_hit 函數

在執行 lookup 指令后,在緩存中找到請求的內容后將自動調用該函數。

此函數一般以如下幾個關鍵字結束。

deliver:表示將找到的內容發送給客戶端,并把控制權交給函數 vcl_deliver。

error code [reason] 。

pass。

restart 重新啟動流程,增加啟動次數,如果重新啟動次數高于 max_restarts 發出一個錯誤警告

vcl_miss 函數

在執行 lookup 指令后,在緩存中沒有找到請求的內容時自動調用該方法。此函數可用于判斷是否需要從后端服務器獲取內容。

此函數一般以如下幾個關鍵字結束。

fetch:表示從后端獲取請求的內容,并把控制權交給 vcl_fetch 函數。

error code [reason] 。

pass。

vcl_fetch 函數

在后端主機更新緩存并且獲取內容后調用該方法,接著,通過判斷獲取的內容來決定是將內容放入緩存,還是直接返回給客戶端。

此函數一般以如下幾個關鍵字結束。

error code [reason]。

pass。

deliver。

esi。

restart 重新啟動流程,增加啟動次數,如果重新啟動次數高于 max_restarts 發出一個錯誤警告

vcl_deliver 函數

將在緩存中找到請求的內容發送給客戶端前調用此方法。

此函數一般以如下幾個關鍵字結束。

error code [reason]。

deliver。

restart 重新啟動流程,增加啟動次數,如果重新啟動次數高于 max_restarts 發出一個錯誤警告

vcl_error

出現錯誤時調用此函數。

此函數一般以如下幾個關鍵字結束。

deliver。

restart。

VCL 處理流程

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

圖 1.VCL 處理流程

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

Varnish 處理 HTTP 請求的過程大致分為如下幾個步驟。

? Receive 狀態(vcl_recv)。也就是請求處理的入口狀態,根據 VCL 規則判斷該請求應該 pass(vcl_pass)或是 pipe(vcl_pipe),還是進入 lookup(本地查詢)。
? Lookup 狀態。進入該狀態后,會在 hash 表中查找數據,若找到,則進入 hit(vcl_hit)狀態,否則進入 miss(vcl_miss)狀態。
? Pass(vcl_pass)狀態。在此狀態下,會直接進入后端請求,即進入 fetch(vcl_fetch)狀態
? Fetch(vcl_fetch)狀態。在 fetch 狀態下,對請求進行后端獲取,發送請求,獲得數據,并根據設置進行本地存儲。
? Deliver(vcl_deliver)狀態。將獲取到的數據發給客戶端,然后完成本次請求。

VCL 內置公共變量

VCL 內置的公共變量可以用在不同的 VCL 函數中,下面根據使用的不同階段進行介紹
當請求到達時,可以使用的公共變量表 1 所示

表 1. 請求到達時可用公共變量

 

公共變量名 含義
req.backend 指定對應的后端主機
server.ip 表示服務器 IP
client.ip 表示客戶端 IP
req.quest 只是請求的類型,例如 GET、HEAD 等
req.url 指定請求的地址
req.proto 表示客戶端發起請求的 HTTP 協議版本
req.http.header 表示對應請求中的 HTTP 頭部信息
req.restarts 表示重啟次數,默認最大值為 4

 

Varnish 在向后端主機請求時,可是用的公共變量如表 2 所示

表 2. 向后端主機請求時可用公共變量

 

公共變量名 含義
beresp.requset 指定請求類型,例如 GET、HEAD 等
beresp.url 表示請求地址
beresp.proto 表示客戶端發起請求的 HTTP 協議版本
beresp.http.header 表示對應請求中 HTTP 頭部信息
beresp.ttl 表示緩存的生存周期,cache 保留時間(s)

 

從 cache 或是后端主機獲取內容后,可以使用的公共變量如表 3 所示

表 3. 后端主機獲取內容時可使用公共變量

 

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

 

對客戶端應答時,可以使用的公共變量如表 4 所示

表 4. 對客戶端相應時可使用公共變量

 

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

 

VCL 調試

VCL 為配置文件語言,無法像 c/c++ 那樣進行單步調試,當 VCL 運行的效果和預期效果不一樣時,很難發現哪出現邏輯錯誤,這時除了查看代碼查找錯誤外,我們還可以采用內置 C 語言和瀏覽器查看返回對象中的狀態來查找邏輯的錯誤。
我們可以采用內置 C 語言來打印相應的信息,例如我們可以在相應的地方打印信息,來查看 VCL 流程的執行是否正確。內置 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 打印信息

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 變量的值

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

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品视频在线| 欧美理论电影网| 亚洲已满18点击进入在线看片| 亚洲精品免费av| 亚洲福利影片在线| 成人亚洲欧美一区二区三区| 国产精品一香蕉国产线看观看| 国产97在线播放| 日韩av片免费在线观看| 久久深夜福利免费观看| 欧美午夜精品伦理| 青草热久免费精品视频| 国产99久久精品一区二区永久免费| 中文字幕免费国产精品| 91大神福利视频在线| 热re91久久精品国99热蜜臀| 国产伊人精品在线| 精品久久中文字幕久久av| 欧美精品激情在线观看| 日韩av在线免费播放| 国内精品400部情侣激情| 精品女同一区二区三区在线播放| 亚洲一区二区三区成人在线视频精品| 亚洲日本成人网| 狠狠色狠色综合曰曰| 国产视频精品va久久久久久| 欧洲亚洲免费视频| 国产一区二区三区在线观看网站| 日韩av电影手机在线观看| 成人国产亚洲精品a区天堂华泰| 日本人成精品视频在线| 亚洲精品乱码久久久久久按摩观| 2019国产精品自在线拍国产不卡| 97人洗澡人人免费公开视频碰碰碰| 亚洲深夜福利在线| 精品无人区太爽高潮在线播放| 亚洲精品av在线播放| 97色在线观看免费视频| 欧美精品亚州精品| 91网站免费观看| 国内精品久久久久影院优| 欧美色videos| 国产精品wwwwww| 久久99久久亚洲国产| 日韩视频免费在线| 人人澡人人澡人人看欧美| 中文字幕欧美精品日韩中文字幕| 欧美成人网在线| 久久久久久久久久久亚洲| 日韩乱码在线视频| 欧美激情一区二区三级高清视频| 久久久久久av| 69av成年福利视频| 亚洲精品电影网| 久久久久久久影院| 亚洲精美色品网站| 97成人在线视频| 国语自产精品视频在线看一大j8| 久久精品国产亚洲| 日本国产欧美一区二区三区| 91精品国产高清久久久久久91| 国产成人涩涩涩视频在线观看| 性欧美亚洲xxxx乳在线观看| 色伦专区97中文字幕| 91亚洲精品久久久久久久久久久久| 亚洲精品美女久久久久| 3344国产精品免费看| 日韩一中文字幕| 97色在线视频| 色噜噜狠狠狠综合曰曰曰88av| 黑人巨大精品欧美一区免费视频| 日韩免费视频在线观看| 亚洲国产97在线精品一区| 92裸体在线视频网站| 日韩亚洲精品视频| 最好看的2019的中文字幕视频| 久久久这里只有精品视频| 欧美性猛交xxxx富婆弯腰| 国产日韩在线播放| 国产亚洲免费的视频看| 欧美成人网在线| 国产精自产拍久久久久久| 中文字幕在线看视频国产欧美| 在线日韩第一页| 久久夜色精品国产亚洲aⅴ| 亚洲图片欧美日产| 中文字幕欧美精品在线| 亚洲精品久久久久久久久久久| 欧美日韩免费在线观看| 亚洲久久久久久久久久久| 中文字幕在线观看日韩| 欧美黄色性视频| 91亚洲国产精品| 久久成人综合视频| 国产精品高潮呻吟久久av野狼| 久久久久久久久国产精品| 色妞一区二区三区| 欧美激情一级欧美精品| 日韩av电影院| 国产精品成久久久久三级| 91高潮在线观看| 亚洲电影成人av99爱色| 欧美日本中文字幕| 2020国产精品视频| 久热精品视频在线观看一区| 97超碰蝌蚪网人人做人人爽| 久久影院中文字幕| 久久久久久亚洲精品中文字幕| 亚洲一区二区三区毛片| 精品成人av一区| 激情av一区二区| 亚洲精品国产美女| 亚洲天堂av在线免费观看| 亚洲精品久久久久国产| 亚洲天堂久久av| 欧美成人在线影院| 成人黄色免费在线观看| 日韩美女毛茸茸| 亚洲三级免费看| 日韩在线观看av| 日韩专区在线播放| 国产精品久久久久一区二区| 国产999精品久久久影片官网| 91精品国产91久久久久久久久| 欧美黑人巨大精品一区二区| 日本不卡免费高清视频| 亚洲乱码一区av黑人高潮| 26uuu亚洲国产精品| 国产精品一区二区久久国产| 亚洲最大中文字幕| 久久99国产精品自在自在app| 欧美野外wwwxxx| 中文字幕在线看视频国产欧美| 国产精品海角社区在线观看| 久久精品99久久香蕉国产色戒| 国产精品久久色| 成人激情电影一区二区| 在线中文字幕日韩| 日韩欧美综合在线视频| 亚洲自拍中文字幕| 日韩欧美综合在线视频| 欧美日韩在线免费| 97在线看免费观看视频在线观看| 91在线高清免费观看| 欧美一级电影免费在线观看| 国产精品网红直播| 性欧美在线看片a免费观看| 5278欧美一区二区三区| 日韩精品极品视频免费观看| 欧美黄色性视频| 久久视频在线视频| 国内精品久久久久久影视8| 一区二区亚洲欧洲国产日韩| 中文字幕久热精品视频在线| 精品国产依人香蕉在线精品| 欧美在线一区二区三区四| 欧美午夜精品久久久久久久| 亚洲a区在线视频| 92看片淫黄大片欧美看国产片| 91丨九色丨国产在线| 精品久久久久久亚洲国产300| 欧美午夜电影在线| 国产精品视频yy9099| 国产精品久久不能|