小生博客:http://xsboke.blog.51cto.com
-------謝謝您的參考,如有疑問(wèn),歡迎交流
目錄
varnishi簡(jiǎn)介
varnish配置組成
-------------------------------------- vcl內(nèi)置預(yù)設(shè)變量
-------------------------------------- 功能語(yǔ)句與對(duì)象
-------------------------------------- varnish中內(nèi)置子程序
-------------------------------------- varnish緩存模式和子程序的關(guān)系
varnish的安裝
varnish實(shí)例配置解析
啟動(dòng)varnish
varnish acl配置解析
一、 Varnish簡(jiǎn)介
1. 作用
Web應(yīng)用加速器,同時(shí)作為http反向緩存代理
2. 特點(diǎn)
Varnish可以使用內(nèi)存也可以使用硬盤進(jìn)行數(shù)據(jù)緩存
支持虛擬內(nèi)存的使用
有精確的時(shí)間管理機(jī)制
狀態(tài)引擎架構(gòu):通過(guò)特定的配置語(yǔ)言設(shè)計(jì)不同的語(yǔ)句
以二叉堆格式管理緩存數(shù)據(jù)
3. Varnish的優(yōu)勢(shì)
Varnish訪問(wèn)速度快,因?yàn)椴捎昧恕癡isual Page Cache”技術(shù),在讀取數(shù)據(jù)時(shí)直接從內(nèi)存中讀取
Varnish支持更多的并發(fā)連接,因?yàn)関arnish的TCP連接比squid快
Varnish通過(guò)管理端口,使用正則表達(dá)式批量的清除部分緩存
4. Varnish的劣勢(shì)
進(jìn)程一旦crash或重啟,緩存的數(shù)據(jù)將從內(nèi)存中完全釋放
在多臺(tái)varnish實(shí)現(xiàn)負(fù)載均衡時(shí),每次請(qǐng)求都會(huì)落到不同的varnish服務(wù)器中,造成url請(qǐng)求可能會(huì)穿透到后端
1)劣勢(shì)解決方案
A、在varnish的后端添加squid/nignx代理,這樣防止了當(dāng)varnish緩存被清空時(shí),瞬間大量的請(qǐng)求發(fā)往web服務(wù)器
B、在負(fù)載均衡上做url哈西,讓單個(gè)url請(qǐng)求固定請(qǐng)求到一臺(tái)varnish服務(wù)器上
5. Varnish的組成
1) Management進(jìn)程(管理進(jìn)程)
對(duì)child進(jìn)程進(jìn)行管理,同時(shí)對(duì)vcl配置進(jìn)行編譯
2) Child進(jìn)程(子進(jìn)程)
生成線程池,負(fù)責(zé)處理用戶請(qǐng)求
6. Varnish配置組成
l 后端配置:指定后端服務(wù)器
l ACL配置:為varnish添加訪問(wèn)控制列表,用于規(guī)則設(shè)置
l Probes配置:實(shí)現(xiàn)后端服務(wù)器的健康檢查
l Directors配置:為varnish添加集群
l 核心子進(jìn)程:為后端服務(wù)器、緩存、訪問(wèn)控制、錯(cuò)誤處理等功能添
一、 arnish配置簡(jiǎn)介
1. vcl內(nèi)置預(yù)設(shè)變量
這些變量一般用于設(shè)置各個(gè)階段的對(duì)象值
預(yù)設(shè)變量是系統(tǒng)固定的,請(qǐng)求進(jìn)入vcl子程序后便生成,這些變量可以方便子進(jìn)程進(jìn)行提取或者自定義
格式一般為:階段 .對(duì)象運(yùn)算符值
1)階段
Req:處理客戶端發(fā)送的請(qǐng)求時(shí)使用
Bereq:處理varinish向后端服務(wù)器發(fā)送的請(qǐng)求時(shí)使用
Beresp:處理后端服務(wù)器響應(yīng)時(shí)使用,用于varnish未緩存前
Resp:處理返回給客戶端的響應(yīng)時(shí)使用
Obj:處理存儲(chǔ)在內(nèi)存中的對(duì)象時(shí)使用
2)對(duì)象
3) 運(yùn)算符
2. 功能語(yǔ)句與對(duì)象
l 一般功能語(yǔ)句都用于匹配對(duì)象,就是對(duì)某個(gè)對(duì)象實(shí)現(xiàn)什么操作
l 格式為:功能語(yǔ)句(對(duì)象)
1)功能語(yǔ)句
ban():清除指定對(duì)象緩存
call():調(diào)用子程序
hash_data():生成hash鍵值,只能在vcl_hash子程序中使用
new():創(chuàng)建一個(gè)vcl對(duì)象,只能在vcl_init子程序中使用
return():結(jié)束當(dāng)前子程序并執(zhí)行下一步動(dòng)作
rollback():恢復(fù)http頭到原來(lái)的狀態(tài),現(xiàn)在使用std.rollback()代替。
.synthetic():合成器,用于自定義一個(gè)響應(yīng)內(nèi)容,只能在vcl_synth和vcl_backend_error子程序中使用
regsub(待處理字符,正則表達(dá)式,替換為的字符):使用正則替換第一次出現(xiàn)的字符串
regsuball(待處理字符,正則表達(dá)式,替換為的字符):使用正則替換所有字符串
2)return的常用動(dòng)作
語(yǔ)法:return(action)
abandon:放棄處理,并生成一個(gè)錯(cuò)誤。
deliver:交付處理
fetch:從后端取出響應(yīng)對(duì)象
hash:哈希緩存處理
lookup:從緩存中查找應(yīng)答數(shù)據(jù)并返回,如果查找不到,則調(diào)用pass函數(shù),從后端服務(wù)器調(diào)用數(shù)據(jù)。
ok:繼續(xù)執(zhí)行
pass:繞過(guò)緩存,直接向后端服務(wù)器調(diào)用數(shù)據(jù)
pipe:建立客戶端和后端服務(wù)器之間的直接連接,從后端服務(wù)器調(diào)用數(shù)據(jù)
purge:清除緩存對(duì)象,構(gòu)建響應(yīng)
restart:重新開(kāi)始
retry:重試后端處理
synth(status code,reason):合成返回客戶端狀態(tài)信息
3. varnish中內(nèi)置子程序
子進(jìn)程也叫狀態(tài)引擎,每一個(gè)狀態(tài)引擎均有自己限定的返回動(dòng)作 return (動(dòng)作); 不同的動(dòng)作將調(diào)用對(duì)應(yīng)下一個(gè)狀態(tài)引擎。
我們可以把一個(gè)請(qǐng)求分為多個(gè)階段,每個(gè)階段都會(huì)調(diào)用不同的狀態(tài)引擎去操作,這樣,我們只要編寫出相應(yīng)的狀態(tài)引擎,就可以控制每個(gè)請(qǐng)求階段。
varnish內(nèi)置子程序均有自己限定的返回動(dòng)作 return (動(dòng)作); 不同的動(dòng)作將調(diào)用對(duì)應(yīng)下一個(gè)子程序
每個(gè)內(nèi)置子程序都需要通過(guò)關(guān)鍵字sub進(jìn)行定義
1) vcl_recv子程序
2) vcl_pipe子程序
3) vcl_pass子程序
4) vc_hit子程序
5) vcl_miss子進(jìn)程
6) vcl_hash子進(jìn)程
7) acl_purge子進(jìn)程
8) vcl_deliver子進(jìn)程
9) vcl_backend——fetch子程序
10) vcl_backend_response子程序
11) vcl_backend_error子程序
12) vcl_synth子程序
13) vcl_init子進(jìn)程
14) acl_fini子進(jìn)程
4. varnish緩存模式和子程序的關(guān)系
l varnish的配置文件,就是通過(guò)各種子程序組成的,當(dāng)varnish運(yùn)行時(shí),也是通過(guò)子程序的配置進(jìn)行相應(yīng)的操作
l 子程序的關(guān)系如下圖
1) 右上角的兩個(gè)圖代表:加載vcl時(shí)執(zhí)行vcl_init子程序,卸載vcl時(shí)執(zhí)行vcl_fini子程序
2) 當(dāng)vcl_recv調(diào)用 hash函數(shù)時(shí)
進(jìn)入該狀態(tài)后,會(huì)通過(guò)vcl_hash子程序,根據(jù)請(qǐng)求的url或其他信息生成hash鍵值,
然后查找hash鍵值相同的緩存數(shù)據(jù),若找到,則進(jìn)入val_hit狀態(tài),否則進(jìn)入vcl_miss狀態(tài)
3) 當(dāng)vcl_recv調(diào)用pass 函數(shù)時(shí)
當(dāng)vcl_recv調(diào)用pass 函數(shù)時(shí),pass將當(dāng)前請(qǐng)求直接轉(zhuǎn)發(fā)到后端服務(wù)器。而后續(xù)的請(qǐng)求仍然通過(guò)varnish處理。
pass (varnish)通常只處理靜態(tài)頁(yè)面。即只在GET 和 HEAD 類型的請(qǐng)求中時(shí)才適合調(diào)用pass函數(shù)。另外,需要注意的一點(diǎn)是,pass模式不能處理POST請(qǐng)求,為什么呢?因?yàn)镻OST請(qǐng)求一般是發(fā)送數(shù)據(jù)給服務(wù)器,需要服務(wù)器接收數(shù)據(jù),并處理數(shù)據(jù),反饋數(shù)據(jù)。是動(dòng)態(tài)的,不作緩存
4) 當(dāng)vcl_recv判斷需要調(diào)用 pipe 函數(shù)時(shí)
當(dāng)vcl_recv判斷需要調(diào)用 pipe 函數(shù)時(shí),varnish會(huì)在客戶端和服務(wù)器之間建立一條直接的連接,之后客戶端的所有請(qǐng)求都直接發(fā)送給服務(wù)器,繞過(guò)varnish,不再由varnish檢查請(qǐng)求,直到連接斷開(kāi)。
類型是POST時(shí)用pipe,舉個(gè)例子,當(dāng)客戶端在請(qǐng)求一個(gè)視頻文件時(shí),或者一個(gè)大的文檔,如.zip .tar 文件,就需要用pipe模式,這些大的文件是不被緩存在varnish中的。
5) 當(dāng)vcl_recv指定purge模式時(shí)
Purge模式用于清除緩存
5. 優(yōu)雅模式garce mode
1) 請(qǐng)求合并
當(dāng)幾個(gè)客戶端請(qǐng)求同一個(gè)頁(yè)面的時(shí)候,varnish只發(fā)送一個(gè)請(qǐng)求到后端服務(wù)器,然后讓其他幾個(gè)請(qǐng)求掛起并等待返回結(jié)果
2) 問(wèn)題
如果數(shù)以千計(jì)或更多的這種請(qǐng)求同時(shí)出現(xiàn),那么這個(gè)等待隊(duì)列將變得龐大,這將導(dǎo)致2類潛在問(wèn)題:驚群?jiǎn)栴}(thundering herd problem),即突然釋放大量的線程去復(fù)制后端返回的結(jié)果,將導(dǎo)致負(fù)載急速上升;沒(méi)有用戶喜歡等待;
3) 解決問(wèn)題
配置varnish在緩存對(duì)象因超時(shí)失效后再保留一段時(shí)間,以給那些等待的請(qǐng)求返回過(guò)去的文件內(nèi)容(stale content)。
1 | 案例: |
三、 varnish的安裝
1. 下載varnish壓縮包
有兩個(gè)地方可下載
1) 通過(guò)Varnish的官方網(wǎng)址http://varnish-cache.org,可以在這里下載最新版本的軟件。
但是有時(shí)候varnish的官網(wǎng)會(huì)被墻
2) GIT下載:git clone https://github.com/varnish/Varnish-Cache/var/tmp/
但是在安裝時(shí)需要先使用./autogen.sh生成configure編譯配置文件
2. Varnish的安裝
首先安裝依賴包
配置varnish
編譯并安裝
拷貝vcl文件
官方提供的vcl配置文件沒(méi)有提示太多的配置信息,在生產(chǎn)環(huán)境中還是需要自己進(jìn)行配置
四、 Varnish VCL實(shí)例配置解析
拓?fù)洵h(huán)境
五、 啟動(dòng)varnish
六、 varnish vcl配置解析
Varnish有自己的編程語(yǔ)法vcl,varnish啟動(dòng)時(shí),會(huì)將配置文件編譯為C語(yǔ)言,然后再執(zhí)行
1. 后端服務(wù)器地址池配置及后端服務(wù)器健康檢查
1) 后端服務(wù)器定義,用于varnish連接指定的后端服務(wù)器
1 | 例:將監(jiān)控塊定義在后端服務(wù)器中 |
2) 監(jiān)視器定義
1 | 例:創(chuàng)建健康監(jiān)測(cè),定義健康檢查名稱為backend_healthcheck |
3) 負(fù)載均衡群集directors
負(fù)載均衡群集需要directors模塊的支持,import directors
Directors負(fù)載均衡支持的算法:
使用random,hash 必須配置權(quán)重值,用于提高隨機(jī)率
1 | 例: |
說(shuō)明:
set命令是設(shè)置變量
unset命令是刪除變量
web_cluster.add_backend(backend , real ); 添加后端服務(wù)器節(jié)點(diǎn),backend 為后端配置別名,real 為權(quán)重值,隨機(jī)率計(jì)算公式:100 * (當(dāng)前權(quán)重 / 總權(quán)重)。
req.backend_hint是varnish的預(yù)定義變量,作用是指定請(qǐng)求后端節(jié)點(diǎn)
vcl對(duì)象需要使用new關(guān)鍵字創(chuàng)建,所有可創(chuàng)建對(duì)象都是內(nèi)定的,使用前必需import,所有new操作只能在vcl_init子程序中。
2. 訪問(wèn)控制列表(acl)
創(chuàng)建一個(gè)地址列表,用于后面的判斷
如果列表中包含了無(wú)法解析的主機(jī)地址,它會(huì)匹配任何地址。
不想匹配的IP,在前面加個(gè)!即可
3. 緩存規(guī)則設(shè)置
說(shuō)明:
X-Forwarded-For 是用來(lái)識(shí)別通過(guò)HTTP代理或負(fù)載均衡方式連接到Web服務(wù)器的客戶端最原始的IP地址的HTTP請(qǐng)求頭字段
要想后端服務(wù)器記載客戶端的真實(shí)IP,只在varnish中設(shè)置不行,還需要修改后端web服務(wù)器的配置(這里是apache做后端web服務(wù)器):
修改框中的變量,指定為varnish中設(shè)置的變量
七、 varnish將不同的url發(fā)送到不同的后端server
AutoIt Code
1 | import directors; # load the directors |
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)頁(yè)標(biāo)題:Web架構(gòu):varnish緩存代理服務(wù)器超詳細(xì)剖析-創(chuàng)新互聯(lián)
URL地址:http://chinadenli.net/article46/doeohg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、Google、ChatGPT、關(guān)鍵詞優(yōu)化、網(wǎng)站內(nèi)鏈、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容