小生博客:http://xsboke.blog.51cto.com
創(chuàng)新互聯(lián)公司是專業(yè)的巴里坤哈薩克網(wǎng)站建設(shè)公司,巴里坤哈薩克接單;提供成都做網(wǎng)站、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行巴里坤哈薩克網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
-------謝謝您的參考,如有疑問,歡迎交流
目錄
varnishi簡介
varnish配置組成
-------------------------------------- vcl內(nèi)置預(yù)設(shè)變量
-------------------------------------- 功能語句與對象
-------------------------------------- varnish中內(nèi)置子程序
-------------------------------------- varnish緩存模式和子程序的關(guān)系
varnish的安裝
varnish實(shí)例配置解析
啟動(dòng)varnish
varnish acl配置解析
一、 Varnish簡介
1. 作用
Web應(yīng)用加速器,同時(shí)作為http反向緩存代理
2. 特點(diǎn)
Varnish可以使用內(nèi)存也可以使用硬盤進(jìn)行數(shù)據(jù)緩存
支持虛擬內(nèi)存的使用
有精確的時(shí)間管理機(jī)制
狀態(tài)引擎架構(gòu):通過特定的配置語言設(shè)計(jì)不同的語句
以二叉堆格式管理緩存數(shù)據(jù)
3. Varnish的優(yōu)勢
Varnish訪問速度快,因?yàn)椴捎昧恕癡isual Page Cache”技術(shù),在讀取數(shù)據(jù)時(shí)直接從內(nèi)存中讀取
Varnish支持更多的并發(fā)連接,因?yàn)関arnish的TCP連接比squid快
Varnish通過管理端口,使用正則表達(dá)式批量的清除部分緩存
4. Varnish的劣勢
進(jìn)程一旦crash或重啟,緩存的數(shù)據(jù)將從內(nèi)存中完全釋放
5. Varnish的組成
1) Management進(jìn)程(管理進(jìn)程)
對child進(jìn)程進(jìn)行管理,同時(shí)對vcl配置進(jìn)行編譯
2) Child進(jìn)程(子進(jìn)程)
生成線程池,負(fù)責(zé)處理用戶請求
6. Varnish配置組成
l 后端配置:指定后端服務(wù)器
l ACL配置:為varnish添加訪問控制列表,用于規(guī)則設(shè)置
l Probes配置:實(shí)現(xiàn)后端服務(wù)器的健康檢查
l Directors配置:為varnish添加集群
l 核心子進(jìn)程:為后端服務(wù)器、緩存、訪問控制、錯(cuò)誤處理等功能添
一、 arnish配置簡介
1. vcl內(nèi)置預(yù)設(shè)變量
這些變量一般用于設(shè)置各個(gè)階段的對象值
預(yù)設(shè)變量是系統(tǒng)固定的,請求進(jìn)入vcl子程序后便生成,這些變量可以方便子進(jìn)程進(jìn)行提取或者自定義
格式一般為:階段 .對象運(yùn)算符值
1)階段
Req:處理客戶端發(fā)送的請求時(shí)使用
Bereq:處理varinish向后端服務(wù)器發(fā)送的請求時(shí)使用
Beresp:處理后端服務(wù)器響應(yīng)時(shí)使用,用于varnish未緩存前
Resp:處理返回給客戶端的響應(yīng)時(shí)使用
Obj:處理存儲(chǔ)在內(nèi)存中的對象時(shí)使用
2)對象
3) 運(yùn)算符
2. 功能語句與對象
l 一般功能語句都用于匹配對象,就是對某個(gè)對象實(shí)現(xiàn)什么操作
l 格式為:功能語句(對象)
1)功能語句
ban():清除指定對象緩存
call():調(diào)用子程序
hash_data():生成hash鍵值,只能在vcl_hash子程序中使用
new():創(chuàng)建一個(gè)vcl對象,只能在vcl_init子程序中使用
return():結(jié)束當(dāng)前子程序并執(zhí)行下一步動(dòng)作
rollback():恢復(fù)http頭到原來的狀態(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)作
語法:return(action)
abandon:放棄處理,并生成一個(gè)錯(cuò)誤。
deliver:交付處理
fetch:從后端取出響應(yīng)對象
hash:哈希緩存處理
lookup:從緩存中查找應(yīng)答數(shù)據(jù)并返回,如果查找不到,則調(diào)用pass函數(shù),從后端服務(wù)器調(diào)用數(shù)據(jù)。
ok:繼續(xù)執(zhí)行
pass:繞過緩存,直接向后端服務(wù)器調(diào)用數(shù)據(jù)
pipe:建立客戶端和后端服務(wù)器之間的直接連接,從后端服務(wù)器調(diào)用數(shù)據(jù)
purge:清除緩存對象,構(gòu)建響應(yīng)
restart:重新開始
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)用對應(yīng)下一個(gè)狀態(tài)引擎。
我們可以把一個(gè)請求分為多個(gè)階段,每個(gè)階段都會(huì)調(diào)用不同的狀態(tài)引擎去操作,這樣,我們只要編寫出相應(yīng)的狀態(tài)引擎,就可以控制每個(gè)請求階段。
varnish內(nèi)置子程序均有自己限定的返回動(dòng)作 return (動(dòng)作); 不同的動(dòng)作將調(diào)用對應(yīng)下一個(gè)子程序
每個(gè)內(nèi)置子程序都需要通過關(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的配置文件,就是通過各種子程序組成的,當(dāng)varnish運(yùn)行時(shí),也是通過子程序的配置進(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ì)通過vcl_hash子程序,根據(jù)請求的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)前請求直接轉(zhuǎn)發(fā)到后端服務(wù)器。而后續(xù)的請求仍然通過varnish處理。
pass (varnish)通常只處理靜態(tài)頁面。即只在GET 和 HEAD 類型的請求中時(shí)才適合調(diào)用pass函數(shù)。另外,需要注意的一點(diǎn)是,pass模式不能處理POST請求,為什么呢?因?yàn)镻OST請求一般是發(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ù)器之間建立一條直接的連接,之后客戶端的所有請求都直接發(fā)送給服務(wù)器,繞過varnish,不再由varnish檢查請求,直到連接斷開。
類型是POST時(shí)用pipe,舉個(gè)例子,當(dāng)客戶端在請求一個(gè)視頻文件時(shí),或者一個(gè)大的文檔,如.zip .tar 文件,就需要用pipe模式,這些大的文件是不被緩存在varnish中的。
5) 當(dāng)vcl_recv指定purge模式時(shí)
Purge模式用于清除緩存
5. 優(yōu)雅模式garce mode
1) 請求合并
當(dāng)幾個(gè)客戶端請求同一個(gè)頁面的時(shí)候,varnish只發(fā)送一個(gè)請求到后端服務(wù)器,然后讓其他幾個(gè)請求掛起并等待返回結(jié)果
2) 問題
如果數(shù)以千計(jì)或更多的這種請求同時(shí)出現(xiàn),那么這個(gè)等待隊(duì)列將變得龐大,這將導(dǎo)致2類潛在問題:驚群問題(thundering herd problem),即突然釋放大量的線程去復(fù)制后端返回的結(jié)果,將導(dǎo)致負(fù)載急速上升;沒有用戶喜歡等待;
3) 解決問題
配置varnish在緩存對象因超時(shí)失效后再保留一段時(shí)間,以給那些等待的請求返回過去的文件內(nèi)容(stale content)。
1 | 案例: |
三、 varnish的安裝
1. 下載varnish壓縮包
有兩個(gè)地方可下載
1) 通過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配置文件沒有提示太多的配置信息,在生產(chǎn)環(huán)境中還是需要自己進(jìn)行配置
四、 Varnish VCL實(shí)例配置解析
拓?fù)洵h(huán)境
五、 啟動(dòng)varnish
六、 varnish vcl配置解析
Varnish有自己的編程語法vcl,varnish啟動(dòng)時(shí),會(huì)將配置文件編譯為C語言,然后再執(zhí)行
1. 后端服務(wù)器地址池配置及后端服務(wù)器健康檢查
1) 后端服務(wù)器定義,用于varnish連接指定的后端服務(wù)器
1 | 例:將監(jiān)控塊定義在后端服務(wù)器中 |
2) 監(jiān)視器定義
1 | 例:創(chuàng)建健康監(jiān)測,定義健康檢查名稱為backend_healthcheck |
3) 負(fù)載均衡群集directors
負(fù)載均衡群集需要directors模塊的支持,import directors
Directors負(fù)載均衡支持的算法:
使用random,hash 必須配置權(quán)重值,用于提高隨機(jī)率
1 | 例: |
說明:
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ù)定義變量,作用是指定請求后端節(jié)點(diǎn)
vcl對象需要使用new關(guān)鍵字創(chuàng)建,所有可創(chuàng)建對象都是內(nèi)定的,使用前必需import,所有new操作只能在vcl_init子程序中。
2. 訪問控制列表(acl)
創(chuàng)建一個(gè)地址列表,用于后面的判斷
如果列表中包含了無法解析的主機(jī)地址,它會(huì)匹配任何地址。
不想匹配的IP,在前面加個(gè)!即可
3. 緩存規(guī)則設(shè)置
說明:
X-Forwarded-For 是用來識(shí)別通過HTTP代理或負(fù)載均衡方式連接到Web服務(wù)器的客戶端最原始的IP地址的HTTP請求頭字段
要想后端服務(wù)器記載客戶端的真實(shí)IP,只在varnish中設(shè)置不行,還需要修改后端web服務(wù)器的配置(這里是apache做后端web服務(wù)器):
修改框中的變量,指定為varnish中設(shè)置的變量
七、 varnish將不同的url發(fā)送到不同的后端server
AutoIt Code
1 | import directors; # load the directors |