vainish詳解

    

  在互聯網時代,站在使用者的角度來看一個網站是否成功與否,就是以網站的響應速度來衡量的,響應速度每慢一秒就會損失大量的用戶。而作爲後端提供服務的公司,要如何解決此類問題也也越來越迫切。

  緩存(cache)就是能夠解決此類問題的一種行之有效方法,它主要是把網站中的大量的靜態資源放在緩存中,當有用戶需要訪問靜態資源時,不需要到web服務器上去請求,而直接把緩存中的靜態資源響應給用戶,節省了大量的時間。

  varnish就是一款開源的HTTP緩存服務,它提供了強大的緩存功能,接下來我們就對varnish做一個全面的解析


 varnish是一個輕量級的Cache和反向代理軟件,varnish主要有以下幾個特性:

 1、基於內存進行緩存,重啓後數據將消失(也可基於文件進行緩存)

 2、能夠精確的設置緩存時長

 3、具有強大的緩存管理功能

 4、可以根據導入Director模塊,實現負載均衡。


 varnish的架構

 wKioL1dFl8HSVDgNAACAz566w40364.png   主要分爲二個部分,結構類似master/worker類型

   1、management:管理進程,主要負責子進程管理,初始化。

   2、child:工作進程,主要負責存儲cache,記錄日誌,接受客戶端請求,與後端聯繫,管理線程


varnish的工作流程:

wKiom1dFmEDhAozWAAHJZTB9x_E528.png  

   工作流程爲:

    主要分爲三種情況:

    不需要檢查緩存:

      1、客戶端發送請求

      2、接受請求後直接發往後端主機,然後取得資源迴應客戶端

    需要檢查緩存但每命中

      1、客戶端發送請求

      2、服務端接受請求發往vcl_hash,檢查緩存,沒有命中

      3、發往後端主機並取得資源,響應客戶端

    需要檢查緩存並且命中

      1、客戶端發送請求,

      2、服務端接受請求發往vcl_hash,檢查緩存,命中

      3、直接把緩存結果響應給用戶


   

   

wKiom1dFnS_gxd-xAABUc8NSuYc158.png



  varnish的配置使用

  Vanish的配置語言:

  Varnish的所有配置都是通過VCL(varnish configure language)來配置的。它是一種基於“域”(domain specific)的簡單編程語言,它支持有限的算術運算和邏輯運算操作、允許使用正則表達式進行字符串匹配、允許用戶使用set自定義變量、支持if判斷語句,也有內置的函數和變量等。使用VCL編寫的緩存策略通常保存至.vcl文件中,其需要編譯成二進制的格式後才能由varnish調用。事實上,整個緩存策略就是由幾個特定的子例程如vcl_recv、vcl_fetch等組成,它們分別在不同的位置(或時間)執行,如果沒有事先爲某個位置自定義子例程,varnish將會執行默認定義的代碼,這些代碼就是default.vcl中被註釋的代碼。
   VCL策略在啓用前,會由management進程將其轉換爲C代碼,而後再由gcc編譯器將C代碼編譯成二進制程序。編譯完成後,management負責將其連接至varnish實例,即child進程。正是由於編譯工作在child進程之外完成,它避免了裝載錯誤格式VCL的風險。因此,varnish修改配置的開銷非常小,其可以同時保有幾份尚在引用的舊版本配置,也能夠讓新的配置即刻生效。編譯後的舊版本配置通常在varnish重啓時纔會被丟棄,如果需要手動清理,則可以使用varnishadm的vcl.discard命令完成

  VCL語法

    (1) //, #,/*...*/:註釋

    (2) sub $name:定義子例程;

(3) 不支持循環,支持條件判斷;

    (4) 有內建變量;

(5) 使用終止語句return,沒有返回值; 

(6) 操作符:=, ==, !=, ~, &&, |

  vanish的內置函數

    (1)、vcl_recv函數
    用於接收用戶請求,當成功接收用戶請求後被調用。通過某種動作來決定如何處理請求。
該函數有如下執行動作:
    pass:表示請求不再本地緩存中查找,且進入pass模式,並將處理請求控制權交給vcl_pass函數
    pipe:表示請求不再本地緩存中查找,且進入pipe模式,並將請求控制權交給vcl_pipe函數。此模式下不會對客戶端做任何的檢查或操作,而是在客戶端和後端服務器直接建立管道,並將數據直接在這個管道中傳輸。此時,keep-alive連接中後續的數據也會通過管道進行傳輸,並且不會出現在任何日誌中。
    error code [reason]:返回錯誤代碼給客戶端並丟棄該請求。Code表示錯誤代碼,如404,405等等。Reason表示錯誤提示信息。
    lookup:表示在緩存中查找請求的對象。並根據查找的結果將請求控制權交給vcl_hit或vcl_miss函數。
 
    (2)、pipe函數
    在進入pipe模式時該函數被調用,用於將客戶端請求直接傳遞給後端服務器,在請求和返回的內容沒有改變的情況下,將不變的內容直接返回給客戶端。直到這個連接關閉。
該函數具有如下執行動作:
    error code reason:返回錯誤代碼並丟棄該請求

 
    (3)、vcl_pass函數
    當vcl_recv函數執行pass動作進入pass模式時該函數被調用,用於將客戶端請求直接轉發給後端服務器,後端服務器響應給客戶端時,不進行緩存。由於直接將請求轉發給後端服務器,因此該連接下的響應數據都是最新的。
該函數具有如下執行動作:
    error code  reason:返回錯誤代碼並丟棄該請求
    pass:表示從後端服務器獲取數據,並將請求控制權交給vcl_fetch函數
    restart:重啓整個vcl,並且該請求重新進行檢查。即該請求重新接受vcl_recv函數的檢查。執行restart動作後,會計算重啓計數,當超過max_restarts最大重啓計數會返回錯誤信息
 
 
    (4)、vcl_hit函數
    該函數在執行lookup命令後,如果在緩存中找到請求數據,則自動調用該函數。

該函數具有如下執行動作:
    deliver:表示從緩存中找到的數據返回給客戶端,並將控制權交給vcl_deliver函數
    pass:進入pass模式,並將控制權交給vcl_fetch。這種模式下,雖然在緩存中找到了數據,但是不使用緩存中的數據,而是從後端服務器獲取。
    error code reason:返回錯誤代碼並丟棄該請求
    restart:重啓整個vcl,並且該請求重新接受vcl_recv函數的檢查。執行restart動作後,會計算重啓計數,當超過max_restart最大計數器後會返回錯誤信息。
 
    (5)、vcl_miss函數
    該函數在執行lookup命令後,如果在緩存中沒有找到請求數據,則自動調用該函數
該函數具有如下執行動作:
    Fetch:表示從後端服務器獲取請求數據,並叫控制權交給vcl_fetch
    Pass::進入pass模式,並將控制權交給vcl_pass。
    Error code reason:表示返回錯誤代碼和信息並丟棄該請求。
    Restart:重啓整個vcl,並且該請求重新接受vcl_recv函數的檢查。執行restart動作後,會計算重啓計數,當超過max_restart最大計數器後將返回錯誤信息。
 
 
    (6)、vcl_fetch函數
    當想從後端服務器獲取數據或更新緩存時該函數被調用,並且根據某種動作來判斷獲取的數據是否被緩存,還是直接返回給客戶端。
該函數具有如下動作:
    deliver:表示從後端服務器獲取到的資源或數據進行緩存。並將控制權交給vcl_deliver函數。
    hit_for_pass:表示從後端服務器獲取到的數據或資源不進行緩存,且將控制權交給vcl_deliver函數。並且後續對該對象的請求直接交給vcl_pass函數。
      error code reason:表示返回錯誤代碼和信息並丟棄該請求。
restart:重啓整個vcl,並且該請求重新接受vcl_recv函數的檢查。執行restart動作後,會計算重啓計數,當超過max_restart最大計數器後將返回錯誤信息。
 
 
    (7)、vcl_deliver函數
    將請求的數據返回給客戶端調用此函數。
該函數具有如下執行動作:
    deliver:將請求數據直接返回給客戶端
    error code reason
    restart





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