首页 > 代码库 > varnish(1)缓存、代理、负载均衡

varnish(1)缓存、代理、负载均衡

varnish是web服务器的缓存(加速器)、反向代理服务器。它的特点是轻量级,可以承载较多并发连接。 如挪威的一家电子新闻用三台varnish替换了10多台squid。

varnish的进程大致分为两类:

1、master进程(读入配置文件、调用合适的存储类型、创建或读入相应大小的缓存文件、管理子进程、初始化管理该结构空间的结构体(通常指的是用来当做存储的内存片段)) 主要功能fork并监控各child进程。

2、child进程(线程)它的功能将各缓存文件映射到内存中,用mmap的方式(mmap:将一个文件或其他的对象映射进内存中,文件会被映射到内存的多个页上。当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.但需注意,直接对该段内存写时不会写入超过当前文件大小的内容.)创建并初始化空闲的结构体。child进程会分配很多worker线程工作。诸多线程各司其职完成相关工作。worker:处理用户请求  accpet:接受用户请求。

varnish也是单个worker线程响应一个用户请求的模式。

  varnish预先分配好空闲的进程空间(结构体),存储时找一个大小较为接近的结构体进行存储。另外varnish不仅支持内存缓存,还支持磁盘上的文件作为缓存的对象的存储。

image 左图用黑色标识的缓存命中后直接构建响应报文发给Client端,而粉色标识则表示缓存miss后,varnish重新构建新的请求向后端的Real Server,这里还有一步很关键图中并没有画出,就是当varnish向后端服务器节点构建新请求时,它本身会判断是否需要对这次新的链接是否予以缓存。

varnish在具体处理语句时需要一个vcl compiler的工具来解释VCL语句,以便工作。

如何安装varnish?

由于系统光盘base源中没有该rpm包,只有epel源才有,或者链接repo.varnish-cache.org/redhat/varnish 3.0/el6

image 已经提供了rpm包可以选择安装。这里推荐安装varnish-3.0.el6的rpm包以及varnish-libs和varnish-docs的包。

下载好利用yum install 安装即可,注意需要解决依赖关系有gcc,cpp,ppl,mpfr,cloog-ppl。

image 左图是varnish生成的具体文件,以及常用的工具。

下面是配置文件中定义的VCL语法格式以及含义,这里解释一二。

示例一image

示例二image

而定义代理服务器则是在/etc/varnish/default.vcl中定义的。

image而如果修改完后想重读配置文件,则需要使用命令varnishadm

命令使用格式如下:varnishadm –S /etc/varnish/secret –T 127.0.0.1:6082(配置文件中定义的管理的默认端口)

不过启动之前先要开启varnish的服务,如下:

[root@libincla varnish]# service varnish start
Starting Varnish Cache:                                    [  OK  ]
[root@libincla varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200       
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-431.el6.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-3.0.5 revision 1a89b1f

Type ‘help‘ for command list.
Type ‘quit‘ to close CLI session.

varnish>

出现命令行的交互界面即为可以启动了。

然后我将配置文件修改了,如下:

分别去掉了注释信息:

image

使用

varnish> vcl.load first1(这个名字是自己定义的) ./default.vcl
200       
VCL compiled.

varnish> vcl.use first1
200 

表示生效了配置,如果想看内容就vcl.show。

想查看具体情况就改后方的server节点的/etc/httpd/conf/http.conf中找到Logformat一项,改成

image

这个图代表它作为缓存服务器反向代理后端服务器是成功的

image

varnish每一次重新装载配置文件都要重新命名。

场景一:如果我想在配置中添加一项,如果是缓存命中,我就在其响应信息中添加Hit,如果缓存没有命中就添加miss。

在配置文件的vcl_deliver中添加如下信息:

image

varnish> vcl.load first2 ./default.vcl
200       
VCL compiled.
varnish> vcl.use first2
200  

然后客户端发起第一次请求。

image

再次请求就命中了。

image

场景二:我们后端server节点还有一个test1.html,如果我们不想让test1.html加入缓存,怎么办?

这里要在vcl_recv中定义。

image

意义精确匹配,只要是url里最后出现了/test1.html,我们通通把它不予考虑缓存。然后就在命令里键入

varnish> vcl.load first3 ./default.vcl
200       
VCL compiled.
varnish> vcl.use first3
200       

客户端发起对test1.html的请求。

image 不管发起几次请求都是miss的。

这里要补充几个关于varnish的内置变量,这几个变量只能用在vcl_hit或vcl_error,且大多为只读)

obj.status

obj.response

obj.ttl

obj.hits等。

系统定义的配置文件,有一项

image

如何手动清理缓存对象呢?

使用acl 定义purgers 的方法

varnish> varnish> vcl.load first4 ./default.vcl
200       
VCL compiled.
varnish> vcl.use first4
200       

[root@billlee html]# curl -X PURGE 172.16.24.100:6081/index.html

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
    <title>200 Purged successful</title>
  </head>
  <body>
    <h1>Error 200 Purged successful</h1>
   

Purged successful


    <h3>Guru Meditation:</h3>
   

XID: 183182795


    <hr>
   

Varnish cache server


  </body>
</html>
[root@billlee html]#

varnish如何对后端服务器节点进行康检

用.probe的方法

image 可以对后端主机进行健康检查了。

然后

varnish> vcl.load first5 ./default.vcl
200       
VCL compiled.
varnish> vcl.use first5
200      

使用varnishstat或者在varnishadm命令行键入 backend.list

varnish> backend.list
200       
Backend name                   Refs   Admin      Probe
default(172.16.24.101,,80)     6      probe      Healthy 8/8

显示很健康、

如果停掉后端server的服务,

当我停掉了服务。

varnish> backend.list
200       
Backend name                   Refs   Admin      Probe
default(172.16.24.101,,80)     6      probe      Healthy 4/8

已经开始检测了

varnish> backend.list
200       
Backend name                   Refs   Admin      Probe
default(172.16.24.101,,80)     6      probe      Sick 0/8

最后还是完蛋了。

varnish还可以代理多个节点,下面是简略规划图:

image

这步骤需要修改varnish的配置文件,/etc/varnish/default.vcl

定义如下信息:

image 调度方式是round-robin,图中有个错误round-robin

此外还需要在vcl_recv里面定义set.backend = webs

image

vcl.load  first6 ./default.vcl

vcl.use   first6

然后让客户端开始发起请求试一下:

image web1这时候拼命刷新还是会被缓存命中的。如果我们请求一个不是index.html的默认页面呢??会不会出现负载均衡的效果呢?

image

image 果然是出现了负载均衡的效果。

在varnishadm中使用param.show可以显示varnish中可以调节的参数。param.set 可以直接设置语法是param.set <param> <value>

varnish(1)缓存、代理、负载均衡