此博文針對varnish3.x系列,有些知識不適合最新的varnish4.x,望廣大博友知曉;
本次只有基礎知識跟介紹,詳細的安裝、生產引用後面一一呈現!!!
一、varnish簡介
varnish是一款高性能、配置靈活、管理方便的代理緩存軟件,在緩存軟件中它與傳統的squid相比是一個新貴,具有配置靈活、運行速度快、管理更加方便等優點.
二、varnish的軟件架構系統介紹:
1. varnish的軟件系統架構類似於Nginx的master-worker,varnish主要有兩個進程:management和child進程;
2. management進程主要的功能是:應用新的配置,管理編譯器編譯vcl配置文件,監控varnish child進程狀態、初始化varnish以及提供一個varnish的命令行接口;
3. child進程,也常被稱之爲cache進程,每個child進程中包含有很多線程,常見的線程主要有:
acceptor線程:主要負責接收新的請求並相應;
worker線程:child進程會爲每個會話分配一個worker線程
Expiry線程:從緩衝中清理過期的內容
三、varnish的配置語言VCL:
1. varnish的配置文件採用了varnish自己獨特的配置語言VarnishConfiguration Language (VCL),VCL是一種簡單的編程語言,僅支持有限的算術運算和邏輯運算操作,支持正則表達式進行字符串的匹配、允許用戶使用set自定義變量、支持if判斷語句,但是不支持循環語句;
2. varnish需要通過management將其轉換成C代碼,再有GCC編譯器將C代碼編譯成二進制文件才能被varnish進程所調用使用;
3. management在將vcl轉換成C代碼的時候會去檢測vcl語法的正確性,如果不正確的會拋出錯誤並且不去轉換,有效的避免了裝載錯誤配置文件的風險;
4. VCL語法:
1). //、#或/* comment */用於註釋;
2). sub$name 定義函數;
3). 不支持循環,有內置變量;
4). 使用終止語句,沒有返回值;
5). 域專用;
6)操作符:=(賦值)、==(等值比較)、~(模式匹配)、!(取反)、&&(邏輯與)、||(邏輯或);
四、varnish的日誌功能:
1. varnish有記錄日誌的功能,但是它的特殊之處在於varnish的日誌是存儲在內存裏面的,默認爲內存保留的空間爲90M,超過90M就會清楚最起初的日誌記錄新日誌;
2. 要想獲取日誌信息,我們可以通過命令接口的方式或者工具去獲取日誌,這樣的工具有varnishlog、varnishncsa或varnishstat;
3. varnish的日誌分爲兩部分,第一部分是計數器,第二部分爲客戶端請求的數據;
五、varnish緩存對象的存儲:
varnish支持將緩存的對象存儲在不同的介質中,我們可以在varnish啓動的使用使用-s選項來指定緩存的存儲類型;
file:使用特定的文件存儲全部的緩存數據,並且通過操作系統mmap()系統調用將整個緩存文件映射至內存區域;
malloc:使用malloc()庫調用在varnish啓動時向操作系統申請指定大小的內存空間以存儲緩存對象;
persistent:與file的功能相同,但是它可以實現持久存儲,但是這個功能目前還尚不穩定,處於測試期;
根據官方資料記載,每個緩存對象會大約多佔用1K左右的存儲空間,所以大約沒100萬個對象就會多佔用1G的空間(處於性能跟穩定性方面考慮,推薦使用malloc);
六、varnish的幾個重要的內置函數
vcl_recv:
vcl_recv是在varnish完成對請求的報文的解碼爲基本數據結構後第一個要執行的子例程,它的主要作用有:
1. 修改客戶端的數據以減少緩存對象的差異性,比如刪除URL中的www字符等;
2. 基於客戶端數據選用緩存策略,比如僅緩存特定的URL請求,不緩存POST請求等;
3. 爲web應用程序執行URL重寫規則;
4. 挑選合適的後端web服務器;
注:vcl_recv也可以通過精巧的策略完成一定意義上的安全功能,以將某些特定的***扼殺於搖籃中。同時,它也可以檢查出一些拼寫類的錯誤並將其修正等;
varnish默認的vcl_recv函數主要有兩個功能:僅處理可以識別的http方法,並且只緩存GET和HEAD方法的http請求,不緩存任何用戶特有的數據;
vcl_fetch
vcl_fetch根據服務器端的響應做出緩存的策略,在任何的VCL狀態引擎中返回的PASS操作都由vcl_fetch進行後續的處理,vcl_fetch中有很多內置的變量比如最常見的用於定義某對象緩存時長的beresp.ttl變量
注:默認的vcl_fetch放棄了緩存任何使用了Set-Cookie首部的響應
vcl_pipe
此函數在進入pipe模式的時候被調用,用於將請求直接傳遞至後端主機,在請求和返回的內容沒有改變的情況下,將不改變的內容返回客戶,知道這個鏈接被關閉
vcl_pass
將請求直接傳遞到後端主機,後端主機在應答數據後將應答數據發送給客戶端,但不會進行緩存,所以在當前這種鏈接的情況下每次返回的都是最新的內容
vcl_hit
如果在執行完成lookup之後,在緩存中找到了請求的內容,那麼會自動調用這個函數
lookup
在緩存中查找是否有請求的對象,並且根據結果把控制權交給vcl_hit(有結果)或者vcl_miss(沒結果)
vcl_miss
執行lookup之後,如果沒有在緩存中找到請求的對象,就調用這個函數,這個函數可以判斷是否需要從後端服務器獲取內容
vcl_deliver
如果lookup在緩存中找到的請求的對象,在將緩存的內容返回給客戶端的時候會調用這個函數
七、varnish的狀態引擎流程圖:
八、varnish簡易的內部處理流程:
九、varnish常見的環境變量:
變量名稱 | 變量的意義 |
.host | 後端服務器的主機名或者IP地址 |
.port | 後端服務器的服務名稱或者端口號 |
client.ip | 客戶端的IP地址 |
srever.hostname | 服務器的主機名 |
server.ip | 服務器端的IP地址 |
req.request | http請求的類型,如GET/HEAD/POST等 |
req.proto | 客戶端發起的http協議的版本 |
req.http.header | 請求重啓的次數 |
beresp.request | 後端服務器請求的類型,如get/head/post等 |
beresp.url | 請求的url地址 |
beresp.proto | 發起請求的http協議的版本 |
beresp.ttl | 最大緩存時長,以秒爲單位 |
obj.status | 返回內容的請求的http狀態碼,如200、500、404、403等; |