web cache 之varnish

本節我們來講一講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框架圖如下:

7065d5f690934b20b13cada1d1377671

 

varnish的VCL狀態引擎

通過下面的狀態引擎,反映出的是所有的客戶端的請求得到響應的過程。

在VCL狀態引擎中,狀態之間具有相關性,但彼此間互相隔離,每個引擎使用return(x)來退出當前狀態並指示varnish進入下一個狀態。

varnish開始處理一個請求時,首先需要分析HTTP請求本身,比如從首部獲取請求方法、驗正其是否爲一個合法的HTT請求等。當這些基本分析結束後就需要做出第一個決策,即varnish是否從緩存中查找請求的資源。這個決定的實現則要由vcl_recv方法來完成,vcl_recv是請求的一個入口。

cf46475871284c27bca19622f7b87547

 

這裏總共有8個狀態引擎:

vcl_recv :用戶請求的入口,判斷是否是可緩存數據。  
vcl_pipe :不可緩存數據,直接管道後端處理    
vcl_hash:可緩存數據,通過hash機制處理,默認url做key;也可以自定義區分客戶端是否支持處理壓縮數據而判斷區分緩存。    
vcl_hit : 緩存命中         
vcl_miss :緩存未命中         
vcl_fetch : 到backend取數據    
vcl_pass :給命中或者未命中的數據提供一個特殊位置以對請求的數據進行特殊處理    
vcl_deliver:將結果返回給客戶端:有2種情況:緩存命中直接返回以及後端取回的數據返回

實驗:

實驗拓撲:

p_w_picpath

varnish的安裝配置

這裏我用的下好的比較新的版本的rpm包進行安裝,本次安裝的varnish是3.0.5的版本

如你想下比較新的版本,這裏是一個網站http://repo.varnish-cache.org/裏面有很多系統的版本,只需要下載跟自己系統相同就OK 了!

好了那麼下面我們就開始安裝配置了。

p_w_picpath

安裝好了之後我們來看看安裝都生成了哪些文件:

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(即內存)作爲緩存對象存儲方式;

p_w_picpath

啓動服務

p_w_picpath

準備後端服務器

先測試2個節點是否正常

p_w_picpath

p_w_picpath

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的地址:

wKioL1QkWV3CQBsaAAJ4lx--RC8174.jpg

 

OK,成功,但是這樣我們並不能知道緩存是不是能命中,下面我們就來設置下讓我們能夠查看緩存是否命中吧。

 

這裏我們只需要在配置文件中加入頭部信息即可。

[root@localhost ~]# vim /etc/varnish/default.vcl

wKiom1QkWo6inJ_-AAB-2L4kO8E082.jpg

重新加載配置文件

wKioL1QkW3Dyeg73AAA6dS-GsEI774.jpg

測試下:

第一次強制刷新

wKiom1QkW7myGWlEAAHY1b55rSU279.jpg

可以看到,緩存爲命中

 

好的那麼我們再來一次

wKioL1QkXDujdZy4AAHLNEe522o356.jpg

正如我們所裏,過段命中了。但是需要注意的是,緩存是有時間的,如何沒有設定的話他本來就會有個默認值的,因此過了默認時間之後緩存就會自動失效了。

 

好的,下面我們就來看下如何基於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;

    }

 }

好的重新載入下

wKioL1QkXlDj6EihAAApQAR_xX4241.jpg

好的開始測試下:

由於負載均衡第一次訪問時是隨機的,因此訪問到任意一個都是有可能的,下面我截了所有情況的圖片

wKioL1QkYGTj8iYtAAIOmg0pW74058.jpg

wKiom1QkYD_xV_-DAAHmXIEh5qQ650.jpg

wKiom1QkYD_iwRAsAAHgEjQvABc084.jpg

wKioL1QkYGSiDkroAAI9lhQJr98419.jpg

 

其實後端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             沒錯這時就可以查看到了

 

 

好了,那麼本節的內容我們就先講到這裏,希望大家多多批評指正,謝謝!

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