Varnish(一)簡介與原理

十五十六發表於2018-09-18

簡介

Varnish是一款高效能且開源的方向代理伺服器和HTTP加速器

Varnish架構

官方給出的架構圖

在這裡插入圖片描述

圖片來自 http://book.varnish-software.com/4.0/chapters/Tuning.html#varnish-architecture

Varnish主要執行2個程式,Management程式和Child程式
Management程式:主要實現應用新的配置、編譯VCL、監控varnish、初始化varnish以及提供一個命令列介面等。Management程式會每隔幾秒鐘探測一下Child程式以判斷其是否正常執行,如果在指定的時長內未得到Child程式的迴應,Management將會重啟此Child程式。
Child程式:主要是監聽客戶端請求,管理worker執行緒,建立快取,更新統計計數器和記錄流量

VCL(Varnish Configuration Language)是varnish配置快取策略的工具,擁有它自己獨立的一種程式語言。在策略啟動前,會由Management程式轉換為c程式碼(利用VCC,將VCL轉換成C的編譯器),然後通過gcc編譯器編譯成2進製程式。編譯完成後Management負責將其連線到child程式,可以在varnish執行過程中動態切換快取策略。

shared memory log(共享記憶體日誌)為了與系統的其它部分進行互動,Child程式使用了可以通過檔案系統介面進行訪問的共享記憶體日誌,因此,如果某執行緒需要記錄資訊,其僅需要持有一個鎖,而後向共享記憶體中的某記憶體區域寫入資料,再釋放持有的鎖即可。而為了減少競爭,每個worker執行緒都使用了日誌資料快取。
共享記憶體日誌大小一般為90M,其分為兩部分,前一部分為計數器,後半部分為客戶端請求的資料。varnish提供了多個不同的工具如varnishlog、varnishncsa或varnishstat等來分析共享記憶體日誌中的資訊並能夠以指定的方式進行顯示。

varnishadm和vagent2是管理Management的一個管理介面

varnish處理流程

在這裡插入圖片描述

圖片來自 http://book.varnish-software.com/4.0/chapters/VCL_Basics.html

  • vcl_recv函式:在Varnish完成對請求報文的解碼為基本資料結構後第一個要執行的子例程,它通常有四個主要用途:1.修改客戶端資料以減少快取物件差異性;比如刪除URL中的www.等字元;2.基於客戶端資料選用快取策略;比如僅快取特定的URL請求、不快取POST請求等;3.為某web應用程式執行URL重寫規則; 4.挑選合適的後端Web伺服器;
  • vcl_hash函式:預設VCL將主機名或IP地址以及請求的URL進行hash
  • vcl_hit函式:在快取中找到請求的內容後將自動呼叫該函式
  • vcl_pass函式:此函式在進入pass模式時被呼叫,使用者將請求直接傳遞至後端主機。後端主機在應答資料後將應答資料傳送給客戶端,但不進行任何快取,在當前連結下每次都返回最新的內容。
  • vcl_miss函式:在快取中沒有找到請求的內容時自動呼叫該方法。此函式可用於判斷是否需要從後端伺服器獲取內容
  • vcl_purge函式:移除快取
  • vcl_pipe函式:進入pipe模式時,使用者將請求直接傳遞至後端主機,在請求和返回的內容沒有改變的情況下,將不變的內容返回給客戶端,直到這個連結被關閉。
  • vcl_backend_fetch函式:可能是被vcl_miss或者vcl_pass呼叫。如果是被vcl_miss函式:呼叫則所獲取的物件會被快取,如果是被vcl_pass呼叫則獲取的物件不會快取
  • vcl_deliver函式:將在快取中找到請求的內容傳送給客戶端前呼叫此函式
  • vcl_synth函式:建立合成響應,例如個性化定製錯誤訊息,要呼叫此函式

相關文章