1、Varnish簡介
Varnish是一款高效能且開源的反向 Proxy伺服器(Reverse Proxy Server),挪威最大的線上報紙Verdens Gang使用3台Varnish代替了原本的12台Squid, 效能比以前更好。Varnish的作者Poul-Henning Kamp是FreeBSD核心的開發人員之一,他認為現在的電腦比起1975年已經複雜許多。在那個時代,儲存媒介只有兩種:記憶體與硬碟。但現在電腦系統的記憶體除了主記憶體外,還包括了CPU內的L1、L2,甚至有L3快取。硬碟上也有自己的快取裝置,因此squid cache自行處理物件替換的架構不可能得知這些情況而做到最佳化,但作業系統可以得知這些情況,所以有關這部份的工作交給作業系統處理,這就是Varnish
Cache的設計架構。
一般來說,使用Varnish代替Squid的理由有三點:
1.1、Varnish採用了“Visual Page Cache”技術,在記憶體的利用上,Varnish比Squid更具有優勢,它避免了Squid頻繁在記憶體、硬碟中分頁檔,效能比Squid還高。
1.2、Varnish的穩定性高,進行相同工作的Squid伺服器發生故障的幾率似乎比Varnish高。
1.3、通過Varnish管理連接埠,可以使用Regex、批量地清除部分緩衝,這一點是Squid不能具備的。
2、安裝及啟用
2.1、安裝準備
安裝依賴包
# yum install automake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig -y
下載安裝包
# wget http://repo.varnish-cache.org/source/varnish-2.1.5.tar.gz
2.2、安裝varnish
# tar xvf varnish-2.1.5.tar.gz
# cd varnish-2.1.5
# ./autogen.sh //配置時會檢查軟體的依耐關係是否滿足
# ./configure
# make && make install
2.3、啟動varnish
# varnishd -f /usr/local/etc/varnish/default.vcl -a 0.0.0.0:8080 -s malloc,1G -T 127.0.0.1:2022
參數含義:
-f 指定varnishd使用的設定檔
-s 配置varnish使用的儲存類型和儲存容量,儲存類型分為目錄檔案或記憶體,預設使用/tmp目錄檔案儲存體。
-a HTTP監聽地址與連接埠。
-T Telnet監聽的地址與連接埠,用於執行varnish的一些管理命令。
所有的參數及含義可以通過“# varnishd --version”命令查看。
以上指令的含義為:varnishd使用/usr/local/etc/varnish/default.vcl中的配置參數,監聽所有發往本機8080連接埠的HTTP請求,將訪問結果緩衝在內容中最大儲存量為1G,varnish指令可以通過2022連接埠發送執行。
2.4、監測
查看日誌
# varnishlog
查看串連數與命中率等
# varnishstat
開啟日誌
# varnishncsa -w /var/log/varnish.log &
3、default.vcl配置說明
vcl_recv
有請求到達後成功接收並分析時被調用,一般以以下幾個關鍵字結束。
error code [reason] 返回code給用戶端,並放棄處理該請求
pass 進入pass模式,把控制權交給vcl_pass
pipe 進入pipe模式,把控制權交給vcl_pipe
lookup 在緩衝裡尋找被請求的對象,根據尋找結果把控制權交給vcl_hit或vcl_miss
vcl_pipe
進入pipe模式時被調用。請求被直接發送到backend,後端和用戶端之間的後繼資料不進行處理,只是簡單傳遞,直到一方關閉串連。一般以以下幾個關鍵字結束。
error code [reason]
pipe
vcl_pass
進入pass模式時被調用。請求被送到後端,後端應答資料送給用戶端,但不進入緩衝。同一串連的後繼請求正常處理。一般以以下幾個關鍵字結束。
error code [reason]
pass
vcl_hash
目前不使用
vcl_hit
在lookup以後如果在cache中找到請求的內容事調用。一般以以下幾個關鍵字結束。
error code [reason]
pass
deliver 將找到的內容發送給用戶端,把控制權交給vcl_deliver.
vcl_miss
lookup後但沒有找到緩衝內容時調用,可以用於判斷是否需要從後端伺服器取內容。一般以以下幾個關鍵字結束。
error code [reason]
pass
fetch 從後端取得請求的內容,把控制權交給vcl_fetch.
vcl_fetch
從後端取得內容後調用。一般以以下幾個關鍵字結束。
error code [reason]
pass
insert 將取到的內容插入緩衝,然後發送給用戶端,把控制權交給vcl_deliver
vcl_deliver
緩衝內容發動給用戶端前調用。一般以以下幾個關鍵字結束。
error code [reason]
deliver 內容發送給用戶端
vcl_timeout
在緩衝內容到期前調用。一般以以下幾個關鍵字結束。
fetch 從後端取得該內容
discard 丟棄該內容
vcl_discard
由於到期或者空間不足而丟棄緩衝內容時調用。一般以以下幾個關鍵字結束。
discard 丟棄
keep 繼續保留在緩衝裡
如果這些內建常式沒有被定義,則執行預設動作
一些內建的變數
now 目前時間,標準時間點(1970)到現在的秒數
backend.host 後端的IP或主機名稱
backend.port 後端的服務名或連接埠
請求到達後有效變數
client.ip 用戶端IP
server.ip 服務端IP
req.request 請求類型,比如GET或者HEAD或者POST
req.url 請求的URL
req.proto 請求的HTTP版本號碼
req.backend 請求對應的後端
req.http.header 對應的HTTP頭
往後段的請求時有效變數
bereq.request 比如GET或HEAD
bereq.url URL
bereq.proto 協議版本
bereq.http.header HTTP頭
從cache或後端取到內容後有效變數
obj.proto HTTP協議版本
obj.status HTTP狀態碼
obj.response HTTP狀態資訊
obj.valid 是否有效HTTP應答
obj.cacheable 是否可以緩衝的內容,也就是說如果HTTP返回是200、203、300、301、302、404、410並且有非0的生存期,則為可緩衝
obj.ttl 生存期,秒
obj.lastuse 上一次請求到現在間隔秒數
對用戶端應答時有效變數
resp.proto response的HTTP版本
resp.status 回給用戶端的HTTP狀態碼
resp.response 回給用戶端的HTTP狀態資訊
resp.http.header HTTP頭