成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

Varnish工作原理及配置

Varnish 工作原理及配置 網(wǎng)址:http://ixdba.blog.51cto.com/2895551/6825551、VCL 使用說明VCL ,即為Varnish Configuation L

Varnish 工作原理及配置 網(wǎng)址:http://ixdba.blog.51cto.com/2895551/682555

1、VCL 使用說明

VCL ,即為Varnish Configuation Language,用來定義varnish 的存取策略,VCL 語法比較簡單,跟C 和perl 比較相似,可以使用指定運算符“=”,比較運算符“==”,邏輯運算符“!,&&,!!”等形式。還支持正則表達樣和用“~”進行ACL 匹配運算,同時還可以使用“set ”這樣的關(guān)鍵字來指定變量。 需要注意的是,“”字符在VCL 里沒有特別的含義,這點與其它語言略有不同,另外,VCL 只是配置,并不是真正的編程語言,沒有循環(huán),也沒有自定義變量。

在講述Varnish 配置之前,首先需要了解下varnish 的配置語法,即VCL ,下面對VCL 常用的一些內(nèi)置函數(shù)和公用變量進行詳細介紹。

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

(1)vcl_recv函數(shù)

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

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

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

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

(2)vcl_pipe函數(shù)

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

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

error code [reason]

pipe

(3)vcl_pass函數(shù)

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

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

error code [reason]

pass

(4)lookup

表示在緩存里查找被請求的對象,并且根據(jù)查找的結(jié)果把控制權(quán)交給函數(shù)vcl_hit或者函數(shù)vcl_miss。

(5)vcl_hit函數(shù)

在執(zhí)行l(wèi)ookup 指令后,如果在緩存中找到請求的內(nèi)容,將自動調(diào)用該函數(shù)。 此函數(shù)一般以如下幾個關(guān)鍵字結(jié)束:

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

,

error code [reason]

pass

(6)vcl_miss函數(shù)

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

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

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

error code [reason]

pass

(7)vcl_fetch函數(shù)

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

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

error code [reason]

pass

deliver

(8)vcl_deliver函數(shù)

在緩存中找到請求的內(nèi)容后,發(fā)送給客戶端前調(diào)用此方法。此函數(shù)一般以如下幾個關(guān)鍵字結(jié)束: error code [reason]

deliver

(9)vcl_timeout 函數(shù)

此函數(shù)在緩存內(nèi)容到期前調(diào)用。一般以如下幾個關(guān)鍵字結(jié)束:

discard:表示從緩存中清除該內(nèi)容。

fetch

(10)vcl_discard函數(shù)

在緩存內(nèi)容到期后或緩存空間不夠時,自動調(diào)用該方法,一般以如下幾個關(guān)鍵字結(jié)束:

keep:表示將內(nèi)容繼續(xù)保留在緩存中。

discard

2、VCL 處理流程圖

通過上面對VCL 函數(shù)的介紹,讀者對各個函數(shù)實現(xiàn)的功能已經(jīng)有了一個了解,其實每個函數(shù)之間都是相互關(guān)聯(lián)的,下圖列出了varnish 處理HTTP 請求的一個運行流程圖。

,

處理過程大致分為如下幾個步驟:

(1) Receive狀態(tài),也就是請求處理的入口狀態(tài),根據(jù)VCL 規(guī)則判斷該請求應(yīng)該是Pass 或Pipe ,或者進入Lookup (本地查詢)。

(2) Lookup狀態(tài),進入此狀態(tài)后,會在hash 表中查找數(shù)據(jù),若找到,則進入Hit 狀態(tài),否則進入miss 狀態(tài)。

(3) Pass狀態(tài),在此狀態(tài)下,會進入后端請求,即進入fetch 狀態(tài)。

(4) Fetch狀態(tài),在Fetch 狀態(tài)下,對請求進行后端的獲取,發(fā)送請求,獲得數(shù)據(jù),并進行本地的存儲。

(5) Deliver狀態(tài), 將獲取到的數(shù)據(jù)發(fā)送給客戶端,然后完成本次請求。

3、內(nèi)置公用變量

VCL內(nèi)置的公用變量可以用在不同的VCL 函數(shù)中,根據(jù)這些公用變量使用的不同階段,下面依次介紹。 當(dāng)請求到達后,可以使用的公用變量如表2所示:

表2

公用變量名稱 含義

req.backend 指定對應(yīng)的后端主機

server.ip 表示服務(wù)器端IP

client.ip 表示客戶端IP

req.request 指定請求的類型,例如GET 、HEAD 、POST 等

req.url 指定請求的地址

req.proto 表示客戶端發(fā)起請求的HTTP 協(xié)議版本

req.http.header 表示對應(yīng)請求中的http 頭部信息

req. restarts 表示請求重啟的次數(shù),默認最大值為4

Varnish 在向后端主機請求時,可以使用的公用變量如表3所示:

表3

公用變量名稱 含義

,

beresp.request 指定請求的類型,例如GET 、HEAD 等

beresp.url 指定請求的地址

beresp .proto 表示客戶端發(fā)起請求的HTTP 協(xié)議版本

beresp .http.header 表示對應(yīng)請求中的http 頭部信息

beresp .ttl 表示緩存的生存周期,也就是cache 保留多長時間,單位是秒

從cache 或者后端主機獲取內(nèi)容后,可以使用的公用變量如表4所示:

表4

公用變量名稱 含義

obj.status 表示返回內(nèi)容的請求狀態(tài)代碼,例如200、302、504等

obj.cacheable 表示返回的內(nèi)容是否可以緩存,也就是說,如果HTTP 返回是200、203、300、301、302、404、410等,并且有非0的生存期,則可以緩存

obj.valid 表示是否是有效的HTTP 應(yīng)答

obj.response 表示返回內(nèi)容的請求狀態(tài)信息

obj.proto 表示返回內(nèi)容的HTTP 協(xié)議版本

obj.ttl 表示返回內(nèi)容的生存周期,也就是緩存時間,單位是秒

obj.lastuse 表示返回上一次請求到現(xiàn)在的間隔時間,單位是秒

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

表5

公用變量名稱 含義

resp.status 表示返回給客戶端的HTTP 狀態(tài)代碼

resp.proto 表示返回給客戶端的HTTP 協(xié)議版本

resp.http.header 表示返回給客戶端的HTTP 頭部信息

resp.response 表示返回給客戶端的HTTP 狀態(tài)信息

在上面的講述中,我們只是介紹了常用的VCL 內(nèi)置公用變量,如果需要了解和使用更多的公用變量信息,請登錄varnish 官方網(wǎng)站查閱。

三 、配置一個簡單的Varnish 實例

由于版本的不同,Varnish 配置文件的寫法也存在一定差異,varnish2.x 版本和1.x 版本之間不但配置文件寫法不同,而且新的版本功能也增加很多,并且去除了很多應(yīng)用BUG ,這里講述的版本是varnish2.1.2,配置文件寫法也以varnish2.x 版本為基準(zhǔn)。

Varnish 安裝完成后,默認的配置文件為/usr/local/varnish/etc/varnish/default.vcl,此文件內(nèi)容默認全部被注釋掉了,這里,我們以這個文件為模板,創(chuàng)建一個新的文件vcl.conf ,并且放到

/usr/local/varnish/etc目錄下,配置完成的vcl.conf 文件如下:

#通過backend 定義了一個名稱為webserver 的后端主機,“.host ”指定后端主機的IP 地址或者域名,“.port ”指定后端主機的服務(wù)端口。其中,“192.168.12.26”就是后端的一個web 服務(wù)器。

backend webserver {

.host = "192.168.12.26";

.port = "80";

}

,

#調(diào)用vcl_recv開始。

sub vcl_recv {

if (req.http.x-forwarded-for) {

set req.http.X-Forwarded-For =

req.http.X-Forwarded-For ", " client.ip;

} else {

set req.http.X-Forwarded-For = client.ip;

}

#如果請求的類型不是GET 、HEAD 、PUT 、POST 、TRACE 、OPTIONS 、DELETE 時,進入pipe 模式。注意這里是“&&”的關(guān)系。

if (req.request != "GET" &&

req.request != "HEAD" &&

req.request != "PUT" &&

req.request != "POST" &&

req.request != "TRACE" &&

req.request != "OPTIONS" &&

req.request != "DELETE") {

return (pipe);

}

#如果請求的類型不是GET 與HEAD ,則進入pass 模式。

if (req.request != "GET" && req.request != "HEAD") {

return (pass);

}

#對ixdba.net 或者ixdba.cn 兩個域名進行緩存加速,這是個泛域名的概念,也就是所有以ixdba.net 或者ixdba.cn 結(jié)尾的域名都進行緩存。

if (req.http.host ~ "^(.*).ixdba.net" || req.http.host ~ "^(.*).ixdba.cn") { set req.backend = webserver;

}

#對以.jsp 和.do 結(jié)尾以及帶有? 的URL 時,直接從后端服務(wù)器讀取內(nèi)容。

if (req.url ~ ".(jsp|do)($|?)") {

return (pass);

} else {

return (lookup);

}

}

sub vcl_pipe {

return (pipe);

}

,

sub vcl_pass {

return (pass);

}

sub vcl_hash {

set req.hash = req.url; if (req.http.host) {

set req.hash = req.http.host; } else {

set req.hash = server.ip; }

return (hash);

}

sub vcl_hit {

if (!obj.cacheable) {

return (pass);

}

return (deliver);

}

sub vcl_miss {

return (fetch);

}

sub vcl_fetch {

if (!beresp.cacheable) { return (pass);

}

if (beresp.http.Set-Cookie) { return (pass);

}

#當(dāng)url 中包含servlet 時,不進行緩存。 if (req.url ~ "^/servlet/") { return (pass);

}

#當(dāng)url 中包含services 時,不進行緩存。 if (req.url ~ "^/services/") {

,

return (pass);

}

#對于請求類型是GET ,并且請求的URL 中包含upload ,那么就進行緩存,緩存的時間是300秒,即5分鐘。 if (req.request == "GET" && req.url ~ "^/upload(.*)$") {

set beresp.ttl = 300s;

}

#對于請求類型是GET ,并且請求的URL 以png 、xsl 、xml 、gif 、css 、js 等結(jié)尾時,則進行緩存,緩存時間為600秒。

if (req.request == "GET" && req.url ~

".(png|xsl|xml|pdf|ppt|doc|docx|chm|rar|zip|bmp|jpeg|swf|ico|mp3|mp4|rmvb|ogg|mov|avi|wmv|swf|txt|png|gif|jpg|css|js|html|htm)$") {

set beresp.ttl = 600s;

}

return (deliver);

}

#下面是添加一個Header 標(biāo)識,以判斷緩存是否命中。

sub vcl_deliver {

if (obj.hits > 0) {

set resp.http.X-Cache = "HIT from www.ixdba.net ";

} else {

set resp.http.X-Cache = "MISS from www.ixdba.net ";

}

return (deliver);

}

本文出自 “技術(shù)成就夢想” 博客,謝絕轉(zhuǎn)載!

網(wǎng)址:http://wangnow.com/article/17-varnish-makes-websites-fly

Varnish 安裝配置和使用

2011-05-05 -Web 開發(fā) 標(biāo)簽: 緩存

先引用Varnish 官方網(wǎng)站宣傳語:Varnish makes websites fly! (讓網(wǎng)站飛?)

Varnish 定義為一種網(wǎng)站加速的軟件(其實就是反向代理),可以把整個網(wǎng)頁內(nèi)容緩存到內(nèi)存(或文件)中,并設(shè)置不同類型的頁面緩存不同時間(TTL ),同時提供緩存的更新(purge )。

此外還可以設(shè)置多個后端服務(wù)器,支持后端服務(wù)器的健康檢查,Header 甚至url 地址的重置修改,以及ESI (Edge Side Includes)功能(與nginx 的ssi 類似)

先介紹一下Varnish 處理請求的主要處理方法和流程

1 vcl_recv,首先接收請求,判斷是否要進一步處理,還是直接轉(zhuǎn)發(fā)給后端(pass )等。 此過程中可以使用和請求相關(guān)的變量,例如客戶端請求的url ,ip ,user-agent ,cookie 等,此過程中可以把不需緩存的地

,

址,通過判斷(相等、不相等、正則匹配等方法)轉(zhuǎn)給后端,例如gif/png/jpg/css/js等靜態(tài)文件;

2 vcl_fetch,當(dāng)從后端服務(wù)器獲取內(nèi)容后會進入此階段,除了可以使用客戶端的請求變量,還可以使用從后端獲取的信息(bersp ),如后端返回的頭信息,設(shè)置此信息的緩存時間TTL 等;

3 vcl_miss 緩存未命中時中要做的處理

4 vcl_hit 緩存命中后做的處理

5 vcl_delever 發(fā)送給客戶端前的處理

6 vcl_pass 交給后端服務(wù)器

7 vcl_hash 設(shè)置緩存的鍵值key

首次請求時過程如下:

recv->hash->miss->fetch->deliver

緩存后再次請求:

recv->hash->hit->deliver(fetch 的過程沒了,這就是我們要做的,把要緩存的頁面保存下來) 直接交給后端pass 的情況:

recv->hash->pass->fetch->deliver(直接從后端獲取數(shù)據(jù)后發(fā)送給客戶端,此時Varnish 相當(dāng)于一個中轉(zhuǎn)站,只負責(zé)轉(zhuǎn)發(fā))

*詳細請求過程可以參考./bin/varnishlog中的輸出日志

下面具體介紹安裝和配置

一、安裝

1 下載源文件,或者選擇相應(yīng)的編譯版本直接安裝(如直接安裝方式以下步驟可跳過)

$ tar zxf varnish-2.1.5.tar.gz

$ cd varnish-2.1.5/

#假設(shè)安裝在/data/app/varnish下,詳細安裝設(shè)置查看幫助./configure --help

$ ./configure --prefix=/data/app/varnish

$ make

$ make install

注意,如果配置中提示一個或者其中幾個警告信息的話,是沒有安裝對應(yīng)的支持庫

configure: WARNING: xsltproc not found – not building documentation

checking for rst2man... no

checking for rst2man.py... no

configure: WARNING: rst2man not found – not building man pages

checking for clock_gettime in -lrt... yes

checking for dlopen in -ldl... yes

checking for library containing initscr... no

configure: WARNING: curses not found; some tools will not be built

,

直接安裝對應(yīng)擴展庫即可,否則varnishhist varnishtop varnishsizes varnishstat這些工具不會安裝 sudo apt-get install xsltproc rst2man libncurses5-dev

二、配置

首先,修改Varnish 的配置文件default.vcl ,默認在安裝目錄的./etc/varnish/下,當(dāng)然,在哪并不重要,可以在啟動服務(wù)的時候指定配置文件(關(guān)鍵你要記得位置……)

#開頭的是注釋標(biāo)記,.host 表示的是后端服務(wù)器的地址或者域名,.port 其對應(yīng)的端口號(這里為了方便測試,Varnish 和web 服務(wù)器都位于一臺機子上,我們用Varnish 監(jiān)聽8080端口,暫時先不修改原web 服務(wù)器的80端口)

backend default {

.host = "127.0.0.1"; .port = "80";

}

好了,可以運行Varnish 了,

sudo ./sbin/varnishd -f /data/app/varnish/etc/varnish/default.vcl -s malloc,32M -T 127.0.0.1:2000 -a 0.0.0.0:8080 -F

直接訪問localhost:8080即可看到經(jīng)過Varnish 輸出的頁面了!怎么樣,很簡單吧。 通過Firebug 或者curl -I查看http 頭信息:

Server: nginx

Content-Type: text/html

Last-Modified: Sat, 09 Apr 2011 15:51:38 GMT

Content-Encoding: gzip

Content-Length: 134

Date: Thu, 05 May 2011 14:15:59 GMT

X-Varnish: 1047954835 1047954830

Age: 7

Via: 1.1 varnish

Connection: keep-alive

可以看到多了三項X-Varnish 、Age 、Via

如何判斷是否是經(jīng)過緩存的呢?

首先可以看Age 字段,如果是大于0的話,說明是從緩存命中的。其次查看X-Varnish 字段,如果是兩個數(shù)字例如X-Varnish: 1668515406 1668515405

代表的是Varnish 兩次請求id (req.xid ):一個為發(fā)起請求的id ,另外一個是獲取緩存的id ,而緩存未命中或者pass 到后端的情況都是一個數(shù)值(當(dāng)然你可以在deliver 過程中修改這些頭信息或者直接隱藏掉)

注意!

如果后端程序設(shè)置了類似這樣的頭信息Cache-Control: max-age=300

,

會重置默認的緩存時間TTL ,當(dāng)然你可以在配置文件中重置這個時間 下面看具體的配置文件,具體作用看注釋

#設(shè)置后端服務(wù)器地址

backend default {

.host = "127.0.0.1";

.port = "80";

}

#允許刷新緩存的ip

acl purgeAllow {

"localhost";

"192.168.56.1";

}

sub vcl_recv {

#刷新緩存設(shè)置

if (req.request == "PURGE") {

#判斷是否允許ip

if (!client.ip ~ purgeAllow) {

error 405 "Not allowed.";

}

#去緩存中查找

return (lookup);

}

#首次訪問增加X-Forwarded-For 頭信息, 方便后端程序

#獲取客戶端ip

if (req.restarts == 0) {

#如果設(shè)置過此header 則要再次附加上, 用, 隔開, 如果 #只有一層代理的話, 就無需設(shè)置了

if (req.http.x-forwarded-for) {

set req.http.X-Forwarded-For =

req.http.X-Forwarded-For ", " client.ip; }

#沒有則要加上

else {

set req.http.X-Forwarded-For = client.ip; }

標(biāo)簽: