日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

web_cache_server -- Varnish

發(fā)布時(shí)間:2024/4/19 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 web_cache_server -- Varnish 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
web cache server : Varnish (web reserve proxy)

一 關(guān)于Varnish

1 Varnish的系統(tǒng)架構(gòu).

Varnish主要運(yùn)行兩個(gè)進(jìn)程,Management進(jìn)程和Child進(jìn)程:

Management進(jìn)程主要實(shí)現(xiàn)初始化varnish,監(jiān)控varnish,編譯VCL和提供了一個(gè)命令行接口,Management進(jìn)程會(huì)每隔幾秒鐘就會(huì)探測(cè)一下Child進(jìn)程以判斷其是否運(yùn)行正常,如果在指定的時(shí)間內(nèi)沒有得到Child進(jìn)程的回應(yīng),Management進(jìn)程會(huì)重啟Child進(jìn)程.

Child進(jìn)程包含多種類型的線程:?
Acceptor線程,接受新的連接請(qǐng)求并回應(yīng).
Worker線程,Child進(jìn)程會(huì)為每一個(gè)請(qǐng)求分配一個(gè)worker線程處理.
Expire線程,從緩存中清理過期內(nèi)容.

2 VCL Varnish ?Configure ?Language?

VCL(varnish configure language)是一門編程語言,它支持有限的算術(shù)運(yùn)算和邏輯運(yùn)算,允許使用正則表達(dá)式進(jìn)行字符串匹配,允許用戶使用set設(shè)置變量的值,支持if判斷語句,也有內(nèi)置的變量.

VCL可以同時(shí)保存幾份尚在引用的舊版本配置,也能夠讓新的配置立即生效,編譯后的舊版本配置通常在varnish重啟是才會(huì)別丟棄,如果需要手動(dòng)清理也可以使用 varnishadm 的 vcl.discard命令完成.

3 Varnish 的后端存儲(chǔ).

Varnish支持多種類型的后端存儲(chǔ),這可以在varnish啟動(dòng)的時(shí)候設(shè)定,后端處處的類型如下:

(1) file 使用特定的文件存儲(chǔ)全部的緩存數(shù)據(jù),并通過操作系統(tǒng)的mmap()系統(tǒng)調(diào)用將整個(gè)文件映射到內(nèi)存區(qū)域中. 在重啟varnish的時(shí)候 數(shù)據(jù)會(huì)丟失
(2) maiiloc 使用malloc()系統(tǒng)調(diào)用在varnish啟動(dòng)的時(shí)候向操作系統(tǒng)申請(qǐng)置頂大小的內(nèi)存空間以存儲(chǔ)緩存對(duì)象. 在重啟varnish的時(shí)候 數(shù)據(jù)會(huì)丟失
(3) persistent 類似file 但是在varnish重啟的時(shí)候數(shù)據(jù)b不會(huì)丟失,但是這個(gè)機(jī)制還不太穩(wěn)定.

為Varnish的指定使用的緩存的類型:

malloc[,size]
file[,path[,size[,granularity]]]


二 VCL Varnish Configure Language?

1 VCL狀態(tài)引擎

varnish開始處理一個(gè)請(qǐng)求的時(shí)候,首先需要分析HTTP請(qǐng)求本身,比如從首部獲取請(qǐng)求方法,驗(yàn)證其是否是一個(gè)合法的HTTP請(qǐng)求,當(dāng)這些基本分析結(jié)束之后需要作出一個(gè)決定,就是是否需要從緩存中查找請(qǐng)求資源這個(gè)決定就是使用vcl_recv方法決定的,如果管理員沒有自定義vcl_recv函數(shù),varnish仍將執(zhí)行默認(rèn)的vcl_recv函數(shù),事實(shí)上varnish官方強(qiáng)烈建議執(zhí)行默認(rèn)的vcl>recv函數(shù)以便處理自定義vcl_recv函數(shù)中可能出現(xiàn)的故障.

2 VCL 語法 Varnish Configure Language

VCL的設(shè)計(jì)參考了C和Perl語言,其基本的語法如下:
(1) // # /* */ 注釋
(2) sub 定義子例程(函數(shù))
(3) 不支持循環(huán) 有內(nèi)置函數(shù)
(4) 沒有返回值 但是可以使用終止語句return?
(5) 操作符 =(賦值) ==(等值比較) ~(模式匹配) ! && ||

3 vcl_recv

vcl_recv 是在varnish完成對(duì)請(qǐng)求報(bào)文的解碼為基本數(shù)據(jù)結(jié)構(gòu)后第一個(gè)要執(zhí)行的子例程,它通常有以下四個(gè)主要功能:

(1) 修改客戶端的數(shù)據(jù)以減少換緩存對(duì)象差異
(2) 基于客戶端數(shù)據(jù)選用換緩存策略
(3) 為web應(yīng)用程序執(zhí)行URL重寫
(4) 挑選合適的后端web服務(wù)器

可以使用下面電費(fèi)終止語句
pass 繞過緩存,就是不從緩存中查詢內(nèi)容或不將內(nèi)容存儲(chǔ)在緩存中.?
pipe 不對(duì)客戶端的進(jìn)行驗(yàn)證操作,而是客戶端與后端服務(wù)器之間建立專用的管道,并直接將數(shù)據(jù)在二者之間進(jìn)行傳遞,此時(shí)
lookup 在緩存中查找用戶的請(qǐng)求.
error 有varnish自己合成一個(gè)響應(yīng)報(bào)文,一般是響應(yīng)一個(gè)錯(cuò)誤類信息,

安全起見,一般在自己定義的vcl_recv中不要使用return() 終止語句,而是再執(zhí)行默認(rèn)額vcl_recv進(jìn)行處理,并由其作出相應(yīng)的處理策略:

4 vcl_fetch?

vcl_recv是根據(jù)客戶端的請(qǐng)求作出緩存決策的,vcl_fetch則是根據(jù)服務(wù)器的響應(yīng)作出緩存決策的,在任何VCL狀態(tài)引擎中返回的pass都將有vl_fetch進(jìn)行后續(xù)處理,通過return 能夠返回給varnish的操作指令:

(1) deliver 緩存該對(duì)象,并將其發(fā)往客戶端.
(2) hit_for_pass 不緩存次對(duì)象 但是可以導(dǎo)致后續(xù)對(duì)此對(duì)象的請(qǐng)求直接送達(dá)到vcl_pass進(jìn)行處理
(3) restart 重啟vcl并增加重啟計(jì)數(shù)器
(4) error code [reason] 返回指定的錯(cuò)誤代碼給客戶端并丟棄請(qǐng)求

可以使用自定義對(duì)對(duì)象的緩存時(shí)長(zhǎng) beresp.ttl?

三 修剪緩存對(duì)象:

1 緩存內(nèi)容的修剪

提高緩存命中率的最有效途徑之一就是增加緩存對(duì)象的生存時(shí)間(TTL),但是這也可能帶來副作用,比如緩存的對(duì)象在到達(dá)為其指定的有效期之前已經(jīng)失效,因此,手動(dòng)檢驗(yàn)緩存對(duì)象的有效性或很有可能成為服務(wù)器管理員的日常工作.

2 移除單個(gè)緩存對(duì)象.

purge用于清理緩存中的某特定的對(duì)象及變種

案例:
acl purges {
"127.0.0.1";
"172.31.0.0"/16;
}

sub vcl_recv {
if(req.request == "PURGE"){
if(!client.ip ~ "purges"){
error 405 “Method not Allowwd";
}
return(lookup);
}
}


sub vcl_hit {
if(req.request == "PRUGE"){
purge;
error 200 "Purge";
}
}
sub vcl_miss {
if(req.request == "PURGE"){
purge;
error 404 "Not IN Cache";
}
}


sub vcl_pass {
if(req.request == "PURGE"){
error 502 "PURGE Not";
}
}



變量的使用:


-----------------------------------------------------------------------------------------------------------------------------
? ? ? ??| vcl_recv | vcl_hash | vcl_hit | vcl_miss | vcl_fetch | vcl_deliver | vcl_pass | vcl_pipe |
-----------------------------------------------------------------------------------------------------------------------------
req.* | OK ? ? ? ? ? | OK ? ? ? ? ? ?| OK ? ? ? | OK ? ? ? ? ? | OK ? ? ? ? ? | OK ? ? ? ? ? ? ? | OK ? ? ? ? ? | OK ? ? ? ? ? |
-----------------------------------------------------------------------------------------------------------------------------
resp.* | ? ? ? ? ? ? ? ? | ? ? ?? ? ? ?| ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? | OK ? ? ? ? ? ? ? | ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?|
-----------------------------------------------------------------------------------------------------------------------------
breq.* | ? ? ? ? ? ? ? ? | ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ?| OK ? ? ? ? ? | OK ? ? ? ? ? | ? ? ? ? ? ? ? ? ? ? | OK ? ? ? ? ? ?| ? ? ? ? ? ? ? ? |
-----------------------------------------------------------------------------------------------------------------------------
bresp.* | ? ? ? ? ? ? ? ? | ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| OK ? ? ? ? ? | ? ? ? ? ? ? ? ? ? ? | ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? |?
-----------------------------------------------------------------------------------------------------------------------------
obj.hits ? | ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? | OK ? ? ? | ? ? ? ? ? ? ? | ? ? ? ? ?? ? ? ? | OK ? ? ? ? ? ? ? | ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? |
-----------------------------------------------------------------------------------------------------------------------------
obj.* | ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? | OK ? ? ? | ? ? ? ? ? ? ? ? | ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? |
-----------------------------------------------------------------------------------------------------------------------------


-----------------------------------------
sub vcl_deliver {
if(obj.hits > 0){
set resp.http.X-Cache = "HIT";
}else{
set resp.http.X-Cache = "MISS";
}
}

-----------------------------------------
cookie :

sub vcl_recv {
if(!(req.url ~ "admin|login")){
unset req.http.cookie;
}
}

sub vcl_fetch {
if(!(req.url ~ "admin|login")){
unset beresp.http.set-cookie;
}
}

----------------------------------------------------------------------
案例:


backend web1 {
.host = "172.31.0.2";
.port = "80";
.probe = { //后端服務(wù)器的健康狀況檢測(cè)
.url = "/health.html";
.interval = 2s;
.window = 5;
.threshold = 2;
}
}


backend web2 {
.host = "172.31.0.3";
.port = "80";
.probe = {
.url = "/health.html";
.interval = 2s;
.window = 5;
.threshold = 2;
}
}




director webserver random { //后端服務(wù)器的負(fù)載均衡
{
.backend = web1;
.weight = 1;
}
{
.backend = web2;
.weight = 1;
}
}


acl purges {
"127.0.0.1";
"172.31.0.0"/16;
}


subb vcl_recv {
if(req.request == "PURGE"){
if(!client.ip ~ purges){
error 404 ”NOt ";
}
return(lookup);
}

if(req.url ~ "\.(js|html|css|png|jpeg|gif) && req.http.cookie){
unset req.http.cookie;
}


set req.backend = webserver;
if(req.url ~ "\.(js|css|html)$"){
set req.backend = web1
}
if(req.url ~ "\.(png|jpeg|gif)$"){
set req.backend = web2;
}

}


sub vcl_hit {
if(req.request == "PURGE"){
purge;
error 200 "OK";
}
}


sub vcl_miss {
if(req.request == "PURGE"){
purge;
error 500 "Not In Cache";
}
}


sub vcl_pass {
if(req.request == "PURGE"){
error 503 "NOt Allowed";
}
}


subb vcl_fetch {
if(req.url ~ "\.(js|css|html|png|jpeg|gif)$" && beresp.http.Set-Cookie){
unset beresp.http.Set-Cookie;
}
if(req.url ~ "\.(js|css|html)$"){
set beresp.ttl = 1200s;
set beresp.http.Expire = 1200;
}
if(req.url ~ "\.(png|jpeg|gif)$"){
set beresp.ttl = 7200s;
set beresp.http.Expire = 7200;
}
}


sub vcl_deliver {
if(obj.hits > 0){
set resp.http.X-Cache = "HIT";
}else{
set resp.http.X-Cacje = "MISS";
}
}

總結(jié)

以上是生活随笔為你收集整理的web_cache_server -- Varnish的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。