国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

云服務(wù)器|WEB服務(wù)器|FTP服務(wù)器|郵件服務(wù)器|虛擬主機(jī)|服務(wù)器安全|DNS服務(wù)器|服務(wù)器知識|Nginx|IIS|Tomcat|

服務(wù)器之家 - 服務(wù)器技術(shù) - 服務(wù)器知識 - Varnish配置文件詳解(架構(gòu)師之路)

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

2021-11-02 15:59服務(wù)器技術(shù)網(wǎng) 服務(wù)器知識

這篇文章主要介紹了Varnish配置文件詳解(架構(gòu)師之路),需要的朋友可以參考下

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

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

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

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

 

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

.connect_timeout定義的是等待連接后端的時間
.first_byte_timeout定義的是等待從backend傳輸過來的第一個字節(jié)的時間
.between_bytes_timeout 定義的是兩個字節(jié)的間隔時間

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

 

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

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

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

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

 

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

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

(1)vcl_recv模塊

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

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

(2)vcl_pipe模塊

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

(3)vcl_pass模塊

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

(4)lookup

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

(5)vcl_hit模塊

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

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

(6)vcl_miss模塊

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

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

(7)vcl_fetch模塊

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

(8)vcl_deliver模塊

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

(9)vcl_timeout 模塊

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

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

(10)vcl_discard模塊

在緩存數(shù)據(jù)到期后或緩存空間不夠時,自動調(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); 
       } 

 

這兩個規(guī)則定義了允許哪些主機(jī)通過http來執(zhí)行purg進(jìn)行緩存刪除。如果不是指定的ip,就會出現(xiàn)http 405錯誤,提示not allowed錯誤字樣。

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

 

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

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

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

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

 

 

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

 


因為squid、varnish都會把客戶端的ip地址放在http_x_forwarded_for里面?zhèn)鹘o后端的web服務(wù)器,所以后端的web程序都要對其進(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判斷表示如果請求的類型不是get、head、put、post、trace、options、delete時,則進(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判斷用于對請求類型是get,并且請求的url以png、swf、txt、gif、css、js等結(jié)尾時,則進(jìn)行緩存,緩存時間為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"; 
 } 

 
這個模塊定義的是添加一個header標(biāo)識,以判斷緩存是否命中。
復(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 href="http://read.easou.com/">read.easou.com</a>
      </address>
   </body>
</html>
"}; 
 return (deliver); 

 

最后這個模塊定義了訪問錯誤頁面時的返回信息。

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

varnish緩存的配置

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

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


varnish 文件緩存的工作流程

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

varnish 安裝

下載 varnish 安裝包

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

安裝 varnish

源代碼安裝包安裝

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

清單 1. pcre 庫安裝代碼

 

復(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

 

啟動 varnish

清單 4. varnish 啟動代碼

復(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 對 http 的監(jiān)聽地址及其端口

varnish 配置

vcl 簡介

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

清單 5. 字符串連接代碼

 

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

 

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

vcl backend

聲明并初始化一個后端對象,代碼如清單 6 所示

清單 6. backend 聲明代碼

 

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

 

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

清單 7. backend 的使用代碼

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

 

vcl 后端的集合 director

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

random director 會根據(jù)所設(shè)置的權(quán)值(weight)來選擇 backend,.retries 參數(shù)表示嘗試找到一個 backend 的最大次數(shù),.weight 參數(shù)表示權(quán)值
? the round-robin director

round-robin director 在選擇 backend 時,會采用循環(huán)的方式依次選擇。
? the client director

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

backend probes

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

清單 8. 定義 backend probes 代碼

 

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

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

 

acl

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

清單 9. acl 定義代碼

 

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

 

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

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

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

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

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

error code [reason]:表示返回“code”給客戶端,并放棄處理該請求。“code”是錯誤標(biāo)識,例如 200 和 405 等。“reason”是錯誤提示信息。

vcl_pipe 函數(shù)

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

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

error code [reason]。

pipe。

vcl_pass 函數(shù)

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

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

error code [reason]。

pass。

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

vcl_hash

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

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

hash。

vcl_hit 函數(shù)

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

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

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

error code [reason] 。

pass。

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

vcl_miss 函數(shù)

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

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

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

error code [reason] 。

pass。

vcl_fetch 函數(shù)

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

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

error code [reason]。

pass。

deliver。

esi。

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

vcl_deliver 函數(shù)

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

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

error code [reason]。

deliver。

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

vcl_error

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

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

deliver。

restart。

vcl 處理流程

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

圖 1.vcl 處理流程

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

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

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

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

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

表 1. 請求到達(dá)時可用公共變量

 

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

 

varnish 在向后端主機(jī)請求時,可是用的公共變量如表 2 所示

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

 

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

 

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

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

 

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

 

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

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

 

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

 

vcl 調(diào)試

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

清單 10. 打印信息代碼

 

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

  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 中查看相應(yīng)的打印信息。查看的打印信息如圖 2 所示:

圖 2. varnish 打印信息

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

我們還可以將某些變量的值設(shè)置到返回給瀏覽器的對象上,然后在瀏覽器中查看該變量的值。設(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 變量的值

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩黄网 | 成人福利网 | 国产精一区| 中文字幕免费视频 | 国产精品久久久久久久久福交 | 免费国产wwwwwww网站 | 精品国偷自产在线 | 亚洲 视频 一区 | 蜜月久综合久久综合国产 | 国产精品99久久久久久久vr | 午夜成人免费电影 | 精品视频一区二区三区 | 自拍 亚洲 欧美 老师 丝袜 | 久久久久综合精品福利啪啪 | 亚洲热视频在线观看 | 亚洲欧美另类久久久精品2019 | 国产精品视频播放 | 亚洲精选久久 | 欧美一区二区三区久久久久久桃花 | 欧美精品一区二区三区在线 | 久久久久久久久久久动漫 | 久久国产精品久久国产精品 | 日韩一区二区三区视频 | 欧美中文字幕一区 | 亚洲日本va中文字幕 | 激情欧美日韩一区二区 | 新久久久久久 | 久草视频观看 | 日本中文字幕在线观看 | 午夜影院| 91麻豆精品国产91久久久久久久久 | 免费骚视频 | 日韩精品免费在线观看 | 精品欧美日韩 | 噜噜噜噜噜在线视频 | 色猫猫国产区一区二在线视频 | 国产精品一区二区三区四区 | 免费欧美一级 | 欧美视频精品在线观看 | 欧美视频在线免费 | 亚洲综合色自拍一区 |