本節我們來講一講web cache相關的知識,現在比較的流行的2種分別爲squid和varnish,他們之間的關係就好比httpd服務器中的Apache和nginx,varnish與傳統的squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優點,很多大型的網站都開始嘗試使用 varnish 來替換 squid,這些都促進 varnish 迅速發展起來。所以今天我們只要講解關於varnish的內容。
varnish
Varnish 是一個web加速器,被安裝在web應用程序前面,緩存web應用程序,並響應用戶請求,varnish 讓您的 web 應用程序運行的更快,並且 varnish 靈活好用。
Varnish分爲master(management)進程和child(worker,主要做cache的工作)進程。master進程讀入命令,進行一些初始化,然後fork並監控child進程。child進程分配若干線程進行工作,主要包括一些管理線程和很多woker線程。
varnish框架圖如下:
varnish的VCL狀態引擎
通過下面的狀態引擎,反映出的是所有的客戶端的請求得到響應的過程。
在VCL狀態引擎中,狀態之間具有相關性,但彼此間互相隔離,每個引擎使用return(x)來退出當前狀態並指示varnish進入下一個狀態。
varnish開始處理一個請求時,首先需要分析HTTP請求本身,比如從首部獲取請求方法、驗正其是否爲一個合法的HTT請求等。當這些基本分析結束後就需要做出第一個決策,即varnish是否從緩存中查找請求的資源。這個決定的實現則要由vcl_recv方法來完成,vcl_recv是請求的一個入口。
這裏總共有8個狀態引擎:
vcl_recv :用戶請求的入口,判斷是否是可緩存數據。
vcl_pipe :不可緩存數據,直接管道後端處理
vcl_hash:可緩存數據,通過hash機制處理,默認url做key;也可以自定義區分客戶端是否支持處理壓縮數據而判斷區分緩存。
vcl_hit : 緩存命中
vcl_miss :緩存未命中
vcl_fetch : 到backend取數據
vcl_pass :給命中或者未命中的數據提供一個特殊位置以對請求的數據進行特殊處理
vcl_deliver:將結果返回給客戶端:有2種情況:緩存命中直接返回以及後端取回的數據返回
實驗:
實驗拓撲:
varnish的安裝配置
這裏我用的下好的比較新的版本的rpm包進行安裝,本次安裝的varnish是3.0.5的版本
如你想下比較新的版本,這裏是一個網站http://repo.varnish-cache.org/裏面有很多系統的版本,只需要下載跟自己系統相同就OK 了!
好了那麼下面我們就開始安裝配置了。
安裝好了之後我們來看看安裝都生成了哪些文件:
root@localhost 3.0.5]# rpm -ql varnish
/etc/logrotate.d/varnish
/etc/rc.d/init.d/varnish 我們的程序腳本
/etc/rc.d/init.d/varnishlog
/etc/rc.d/init.d/varnishncsa
/etc/sysconfig/varnish
/etc/varnish
/etc/varnish/default.vcl 我們的配置文件
/usr/bin/varnish_reload_vcl
/usr/bin/varnishadm
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishreplay
/usr/bin/varnishsizes
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
/usr/lib64/varnish
/usr/lib64/varnish/libvarnish.so
/usr/lib64/varnish/libvarnishcompat.so
/usr/lib64/varnish/libvcl.so
/usr/lib64/varnish/libvgz.so
/usr/lib64/varnish/vmods
/usr/lib64/varnish/vmods/libvmod_std.so
/usr/sbin/varnishd
/usr/share/doc/varnish-3.0.5
/usr/share/doc/varnish-3.0.5/ChangeLog
/usr/share/doc/varnish-3.0.5/LICENSE
/usr/share/doc/varnish-3.0.5/README
/usr/share/doc/varnish-3.0.5/README.redhat
/usr/share/doc/varnish-3.0.5/examples
/usr/share/doc/varnish-3.0.5/examples/default.vcl
/usr/share/doc/varnish-3.0.5/examples/zope-plone.vcl
/usr/share/man/man1/varnishadm.1.gz
/usr/share/man/man1/varnishd.1.gz
/usr/share/man/man1/varnishhist.1.gz
/usr/share/man/man1/varnishlog.1.gz
/usr/share/man/man1/varnishncsa.1.gz
/usr/share/man/man1/varnishreplay.1.gz
/usr/share/man/man1/varnishsizes.1.gz
/usr/share/man/man1/varnishstat.1.gz
/usr/share/man/man1/varnishtest.1.gz
/usr/share/man/man1/varnishtop.1.gz
/usr/share/man/man3/vmod_std.3.gz
/usr/share/man/man7/varnish-cli.7.gz
/usr/share/man/man7/varnish-counters.7.gz
/usr/share/man/man7/vcl.7.gz
/var/lib/varnish 如果想以文件形式存儲緩存的存放位置
/var/log/varnish
修改配置文件
vim
/etc/sysconfig/varnish
# 編輯啓動腳本配置文件,修改如下項
VARNISH_LISTEN_PORT=80
# varnish監聽端口改爲80端口
VARNISH_STORAGE_SIZE=64M
# 此值根據自身情況調整,測試環境可調低此值
VARNISH_STORAGE=
"malloc,${VARNISH_STORAGE_SIZE}"
#使用malloc(即內存)作爲緩存對象存儲方式;
啓動服務
準備後端服務器
先測試2個節點是否正常
OK。都正常。下面就來修改緩存服務器中的配置文件了
修改varnish配置文件
老規矩修改之前先備份
[root@localhost ~]# cp /etc/varnish/default.vcl /etc/varnish/default.vcl.bak
OK,開始修改
[root@localhost ~]# vim /etc/varnish/default.vcl
backend default {
.host = "192.168.1.108"; 這裏我們先用一臺backend來進行測試
.port = "80";
}
sub vcl_recv {
set req.backend = default;
return (ok);
}
下面就開始讀入配置文件:這裏我們需要了解一個命令varnishadm命令
[root@localhost ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
進入之後輸入help可以看到幫助信息
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-431.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-3.0.5 revision 1a89b1f
Type 'help' for command list.
Type 'quit' to close CLI session.
varnish> help
200
help [command]
ping [timestamp]
auth response
quit
banner
status
start
stop
vcl.load <configname> <filename>
vcl.inline <configname> <quoted_VCLstring>
vcl.use <configname>
vcl.discard <configname>
vcl.list
vcl.show <configname>
param.show [-l] [<param>]
param.set <param> <value>
panic.show
panic.clear
storage.list
backend.list
backend.set_health matcher state
ban.url <regexp>
ban <field> <operator> <arg> [&& <field> <oper> <arg>]...
ban.list
這裏其實就是一些命令
下面我們就開始執行命令使配置文件生效了
varnish> vcl.load rest1 default.vcl 載入命令
106
Message from VCC-compiler:
Invalid return "ok"
('input' Line 124 Pos 17)
return (ok);
----------------##--
...in subroutine "vcl_recv"
('input' Line 15 Pos 5)
sub vcl_recv {
----########--
...which is the "vcl_recv" method
Legal returns are: "error" "lookup" "pass" "pipe"
Running VCC-compiler failed, exit 1
VCL compilation failed 注意當有語法出現錯誤時,載入是不會成功的,還會跳出提示信息,那麼我們就過去改吧。
varnish> vcl.load rest1 default.vcl
200
VCL compiled. OK,修改完成之後他就會顯示完成了
varnish> vcl.use rest1 使用命令
200
好了下面我們來測試下
讓我們輸入varnish的地址:
OK,成功,但是這樣我們並不能知道緩存是不是能命中,下面我們就來設置下讓我們能夠查看緩存是否命中吧。
這裏我們只需要在配置文件中加入頭部信息即可。
[root@localhost ~]# vim /etc/varnish/default.vcl
重新加載配置文件
測試下:
第一次強制刷新
可以看到,緩存爲命中
好的那麼我們再來一次
正如我們所裏,過段命中了。但是需要注意的是,緩存是有時間的,如何沒有設定的話他本來就會有個默認值的,因此過了默認時間之後緩存就會自動失效了。
好的,下面我們就來看下如何基於2臺backend實現負載均衡的。
[root@localhost ~]# vim /etc/varnish/default.vcl
backend webserver1 { .host = "192.168.1.108"; .port = "80"; .probe = { .url = "/index.html"; .interval = 1s; .window = 3; .threshold = 1; } } backend webserver2 { .host = "192.168.1.109"; .port = "80"; .probe = { .url = "/index.html"; .interval = 1s; .window = 3; .threshold = 1; } } director webserver random { { .backend = webserver1; .weight = 3; } { .backend = webserver2; .weight = 1; } } sub vcl_recv { set req.backend = webserver; } sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache = "Hit from"+" "+server.ip; } else { set resp.http.X-Cache = "Miss via"+" "+server.ip; } }
好的重新載入下
好的開始測試下:
由於負載均衡第一次訪問時是隨機的,因此訪問到任意一個都是有可能的,下面我截了所有情況的圖片
其實後端backend的機子的健康狀態都是可以查看的
varnish> backend.list
200
Backend name Refs Admin Probe
default(127.0.0.1,,80) 1 probe Healthy (no probe)
default(192.168.1.108,,80) 2 probe Healthy (no probe)
webserver1(192.168.1.108,,80) 1 probe Healthy 3/3
webserver2(192.168.1.109,,80) 1 probe Healthy 3/3
現在2臺機子都在線。
一旦某臺機子下線宕機了可以立刻查看的到。我們試下將第二個節點服務停止了看看
varnish> backend.list
200
Backend name Refs Admin Probe
default(127.0.0.1,,80) 1 probe Healthy (no probe)
default(192.168.1.108,,80) 2 probe Healthy (no probe)
webserver1(192.168.1.108,,80) 1 probe Healthy 3/3
webserver2(192.168.1.109,,80) 1 probe Sick 0/3 沒錯這時就可以查看到了
好了,那麼本節的內容我們就先講到這裏,希望大家多多批評指正,謝謝!