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             没错这时就可以查看到了

 

 

好了,那么本节的内容我们就先讲到这里,希望大家多多批评指正,谢谢!

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