一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - 服務器知識 - Varnish配置文件詳解(架構師之路)

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

2021-11-02 15:59服務器技術網 服務器知識

這篇文章主要介紹了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緩存的配置

簡單的配置文件內容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
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配置文件詳解(架構師之路)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品九九久久一区hh | 成人观看免费大片在线观看 | 娇妻中日久久持久久 | 情缘免费观看完整版 | 2022最新a精品视频在线观看 | 国产高清视频 | 精品一区二区三区高清免费观看 | 色五夜婷婷| 色综合网亚洲精品久久 | 91超级碰 | 久青草国产在线观看视频 | 久久精品动漫网一区二区 | 91中文字幕yellow字幕网 | 扒开斗罗美女了的胸罩和内裤漫画 | 色妞女女女女女bbbb | 色呦呦在线免费观看 | 亚洲AV无码国产精品色在线看 | 亚洲一级片在线播放 | 奇米影视久久 | 91精品国产91热久久久久福利 | 美女被到爽流动漫 | 50度灰破解版v5.7.0 | 糖心视频在线观看 | 日本免费一区二区三区 | 三级黄色片在线免费观看 | 国产日本韩国不卡在线视频 | 男生的j桶女人屁免费视频 男生操男生 | 精品操 | 天天做天天爽天天谢 | 国产一卡二卡3卡4卡四卡在线 | 免费看男人使劲躁女人小说 | 丰满大屁股美女一级毛片 | 给我免费观看的视频在线播放 | 欧美性野久久久久久久久 | 视频网站入口在线看 | 国产小视频免费看 | 18无删减羞羞网站动漫 | 九九九九九热 | 午夜无码国产理论在线 | 性一交一乱一伧老太 | 国产精品第一 |