性感的開源軟件Varnish-基礎知識篇

  此博文針對varnish3.x系列,有些知識不適合最新的varnish4.x,望廣大博友知曉;

  本次只有基礎知識跟介紹,詳細的安裝、生產引用後面一一呈現!!!

一、varnish簡介

    varnish是一款高性能、配置靈活、管理方便的代理緩存軟件,在緩存軟件中它與傳統的squid相比是一個新貴,具有配置靈活、運行速度快、管理更加方便等優點.

二、varnish的軟件架構系統介紹:

    1.  varnish的軟件系統架構類似於Nginxmaster-workervarnish主要有兩個進程:managementchild進程;

    2. management進程主要的功能是:應用新的配置,管理編譯器編譯vcl配置文件,監控varnish child進程狀態、初始化varnish以及提供一個varnish的命令行接口;

    3. child進程,也常被稱之爲cache進程,每個child進程中包含有很多線程,常見的線程主要有:

       acceptor線程:主要負責接收新的請求並相應;

      worker線程:child進程會爲每個會話分配一個worker線程

      Expiry線程:從緩衝中清理過期的內容

     4. varnish的工作架構圖:   wKiom1PrAUSTjGLIAAIKIgDEuCg394.jpg

三、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. 要想獲取日誌信息,我們可以通過命令接口的方式或者工具去獲取日誌,這樣的工具有varnishlogvarnishncsavarnishstat;

    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方法,並且只緩存GETHEAD方法的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的狀態引擎流程圖:

wKioL1PrBe3Su1G4AAOKPdMpI6I394.jpg

八、varnish簡易的內部處理流程:

wKiom1PrBWHB5tADAAGxGwHC1Yk361.jpg

九、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狀態碼,如200500404403等;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章