您好,登錄后才能下訂單哦!
小生博客:http://xsboke.blog.51cto.com
-------謝謝您的參考,如有疑問,歡迎交流
目錄
varnishi簡介
varnish配置組成
-------------------------------------- vcl內置預設變量
-------------------------------------- 功能語句與對象
-------------------------------------- varnish中內置子程序
-------------------------------------- varnish緩存模式和子程序的關系
varnish的安裝
varnish實例配置解析
啟動varnish
varnish acl配置解析
一、 Varnish簡介
1. 作用
Web應用加速器,同時作為http反向緩存代理
2. 特點
Varnish可以使用內存也可以使用硬盤進行數據緩存
支持虛擬內存的使用
有精確的時間管理機制
狀態引擎架構:通過特定的配置語言設計不同的語句
以二叉堆格式管理緩存數據
3. Varnish的優勢
Varnish訪問速度快,因為采用了“Visual Page Cache”技術,在讀取數據時直接從內存中讀取
Varnish支持更多的并發連接,因為varnish的TCP連接比squid快
Varnish通過管理端口,使用正則表達式批量的清除部分緩存
4. Varnish的劣勢
進程一旦crash或重啟,緩存的數據將從內存中完全釋放
5. Varnish的組成
1) Management進程(管理進程)
對child進程進行管理,同時對vcl配置進行編譯
2) Child進程(子進程)
生成線程池,負責處理用戶請求
6. Varnish配置組成
l 后端配置:指定后端服務器
l ACL配置:為varnish添加訪問控制列表,用于規則設置
l Probes配置:實現后端服務器的健康檢查
l Directors配置:為varnish添加集群
l 核心子進程:為后端服務器、緩存、訪問控制、錯誤處理等功能添
一、 arnish配置簡介
1. vcl內置預設變量
這些變量一般用于設置各個階段的對象值
預設變量是系統固定的,請求進入vcl子程序后便生成,這些變量可以方便子進程進行提取或者自定義
格式一般為:階段 .對象運算符值
1)階段
Req:處理客戶端發送的請求時使用
Bereq:處理varinish向后端服務器發送的請求時使用
Beresp:處理后端服務器響應時使用,用于varnish未緩存前
Resp:處理返回給客戶端的響應時使用
Obj:處理存儲在內存中的對象時使用
2)對象
3) 運算符
2. 功能語句與對象
l 一般功能語句都用于匹配對象,就是對某個對象實現什么操作
l 格式為:功能語句(對象)
1)功能語句
ban():清除指定對象緩存
call():調用子程序
hash_data():生成hash鍵值,只能在vcl_hash子程序中使用
new():創建一個vcl對象,只能在vcl_init子程序中使用
return():結束當前子程序并執行下一步動作
rollback():恢復http頭到原來的狀態,現在使用std.rollback()代替。
.synthetic():合成器,用于自定義一個響應內容,只能在vcl_synth和vcl_backend_error子程序中使用
regsub(待處理字符,正則表達式,替換為的字符):使用正則替換第一次出現的字符串
regsuball(待處理字符,正則表達式,替換為的字符):使用正則替換所有字符串
2)return的常用動作
語法:return(action)
abandon:放棄處理,并生成一個錯誤。
deliver:交付處理
fetch:從后端取出響應對象
hash:哈希緩存處理
lookup:從緩存中查找應答數據并返回,如果查找不到,則調用pass函數,從后端服務器調用數據。
ok:繼續執行
pass:繞過緩存,直接向后端服務器調用數據
pipe:建立客戶端和后端服務器之間的直接連接,從后端服務器調用數據
purge:清除緩存對象,構建響應
restart:重新開始
retry:重試后端處理
synth(status code,reason):合成返回客戶端狀態信息
3. varnish中內置子程序
子進程也叫狀態引擎,每一個狀態引擎均有自己限定的返回動作 return (動作); 不同的動作將調用對應下一個狀態引擎。
我們可以把一個請求分為多個階段,每個階段都會調用不同的狀態引擎去操作,這樣,我們只要編寫出相應的狀態引擎,就可以控制每個請求階段。
varnish內置子程序均有自己限定的返回動作 return (動作); 不同的動作將調用對應下一個子程序
每個內置子程序都需要通過關鍵字sub進行定義
1) vcl_recv子程序
2) vcl_pipe子程序
3) vcl_pass子程序
4) vc_hit子程序
5) vcl_miss子進程
6) vcl_hash子進程
7) acl_purge子進程
8) vcl_deliver子進程
9) vcl_backend——fetch子程序
10) vcl_backend_response子程序
11) vcl_backend_error子程序
12) vcl_synth子程序
13) vcl_init子進程
14) acl_fini子進程
4. varnish緩存模式和子程序的關系
l varnish的配置文件,就是通過各種子程序組成的,當varnish運行時,也是通過子程序的配置進行相應的操作
l 子程序的關系如下圖
1) 右上角的兩個圖代表:加載vcl時執行vcl_init子程序,卸載vcl時執行vcl_fini子程序
2) 當vcl_recv調用 hash函數時
進入該狀態后,會通過vcl_hash子程序,根據請求的url或其他信息生成hash鍵值,
然后查找hash鍵值相同的緩存數據,若找到,則進入val_hit狀態,否則進入vcl_miss狀態
3) 當vcl_recv調用pass 函數時
當vcl_recv調用pass 函數時,pass將當前請求直接轉發到后端服務器。而后續的請求仍然通過varnish處理。
pass (varnish)通常只處理靜態頁面。即只在GET 和 HEAD 類型的請求中時才適合調用pass函數。另外,需要注意的一點是,pass模式不能處理POST請求,為什么呢?因為POST請求一般是發送數據給服務器,需要服務器接收數據,并處理數據,反饋數據。是動態的,不作緩存
4) 當vcl_recv判斷需要調用 pipe 函數時
當vcl_recv判斷需要調用 pipe 函數時,varnish會在客戶端和服務器之間建立一條直接的連接,之后客戶端的所有請求都直接發送給服務器,繞過varnish,不再由varnish檢查請求,直到連接斷開。
類型是POST時用pipe,舉個例子,當客戶端在請求一個視頻文件時,或者一個大的文檔,如.zip .tar 文件,就需要用pipe模式,這些大的文件是不被緩存在varnish中的。
5) 當vcl_recv指定purge模式時
Purge模式用于清除緩存
5. 優雅模式garce mode
1) 請求合并
當幾個客戶端請求同一個頁面的時候,varnish只發送一個請求到后端服務器,然后讓其他幾個請求掛起并等待返回結果
2) 問題
如果數以千計或更多的這種請求同時出現,那么這個等待隊列將變得龐大,這將導致2類潛在問題:驚群問題(thundering herd problem),即突然釋放大量的線程去復制后端返回的結果,將導致負載急速上升;沒有用戶喜歡等待;
3) 解決問題
配置varnish在緩存對象因超時失效后再保留一段時間,以給那些等待的請求返回過去的文件內容(stale content)。
1 | 案例: |
三、 varnish的安裝
1. 下載varnish壓縮包
有兩個地方可下載
1) 通過Varnish的官方網址http://varnish-cache.org,可以在這里下載最新版本的軟件。
但是有時候varnish的官網會被墻
2) GIT下載:git clone https://github.com/varnish/Varnish-Cache/var/tmp/
但是在安裝時需要先使用./autogen.sh生成configure編譯配置文件
2. Varnish的安裝
首先安裝依賴包
配置varnish
編譯并安裝
拷貝vcl文件
官方提供的vcl配置文件沒有提示太多的配置信息,在生產環境中還是需要自己進行配置
四、 Varnish VCL實例配置解析
拓撲環境
五、 啟動varnish
六、 varnish vcl配置解析
Varnish有自己的編程語法vcl,varnish啟動時,會將配置文件編譯為C語言,然后再執行
1. 后端服務器地址池配置及后端服務器健康檢查
1) 后端服務器定義,用于varnish連接指定的后端服務器
1 | 例:將監控塊定義在后端服務器中 |
2) 監視器定義
1 | 例:創建健康監測,定義健康檢查名稱為backend_healthcheck |
3) 負載均衡群集directors
負載均衡群集需要directors模塊的支持,import directors
Directors負載均衡支持的算法:
使用random,hash 必須配置權重值,用于提高隨機率
1 | 例: |
說明:
set命令是設置變量
unset命令是刪除變量
web_cluster.add_backend(backend , real ); 添加后端服務器節點,backend 為后端配置別名,real 為權重值,隨機率計算公式:100 * (當前權重 / 總權重)。
req.backend_hint是varnish的預定義變量,作用是指定請求后端節點
vcl對象需要使用new關鍵字創建,所有可創建對象都是內定的,使用前必需import,所有new操作只能在vcl_init子程序中。
2. 訪問控制列表(acl)
創建一個地址列表,用于后面的判斷
如果列表中包含了無法解析的主機地址,它會匹配任何地址。
不想匹配的IP,在前面加個!即可
3. 緩存規則設置
說明:
X-Forwarded-For 是用來識別通過HTTP代理或負載均衡方式連接到Web服務器的客戶端最原始的IP地址的HTTP請求頭字段
要想后端服務器記載客戶端的真實IP,只在varnish中設置不行,還需要修改后端web服務器的配置(這里是apache做后端web服務器):
修改框中的變量,指定為varnish中設置的變量
七、 varnish將不同的url發送到不同的后端server
AutoIt Code
1 | import directors; # load the directors |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。