首页 > 代码库 > 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不仅支持内存缓存,还支持磁盘上的文件作为缓存的对象的存储。
左图用黑色标识的缓存命中后直接构建响应报文发给Client端,而粉色标识则表示缓存miss后,varnish重新构建新的请求向后端的Real Server,这里还有一步很关键图中并没有画出,就是当varnish向后端服务器节点构建新请求时,它本身会判断是否需要对这次新的链接是否予以缓存。
varnish在具体处理语句时需要一个vcl compiler的工具来解释VCL语句,以便工作。
如何安装varnish?
由于系统光盘base源中没有该rpm包,只有epel源才有,或者链接repo.varnish-cache.org/redhat/varnish 3.0/el6
已经提供了rpm包可以选择安装。这里推荐安装varnish-3.0.el6的rpm包以及varnish-libs和varnish-docs的包。
下载好利用yum install 安装即可,注意需要解决依赖关系有gcc,cpp,ppl,mpfr,cloog-ppl。
左图是varnish生成的具体文件,以及常用的工具。
下面是配置文件中定义的VCL语法格式以及含义,这里解释一二。
示例一
示例二
而定义代理服务器则是在/etc/varnish/default.vcl中定义的。
而如果修改完后想重读配置文件,则需要使用命令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>
出现命令行的交互界面即为可以启动了。然后我将配置文件修改了,如下:
分别去掉了注释信息:
使用
varnish> vcl.load first1(这个名字是自己定义的) ./default.vcl
200
VCL compiled.
varnish> vcl.use first1
200
表示生效了配置,如果想看内容就vcl.show。
想查看具体情况就改后方的server节点的/etc/httpd/conf/http.conf中找到Logformat一项,改成
这个图代表它作为缓存服务器反向代理后端服务器是成功的
varnish每一次重新装载配置文件都要重新命名。
场景一:如果我想在配置中添加一项,如果是缓存命中,我就在其响应信息中添加Hit,如果缓存没有命中就添加miss。
在配置文件的vcl_deliver中添加如下信息:
varnish> vcl.load first2 ./default.vcl
200
VCL compiled.
varnish> vcl.use first2
200
然后客户端发起第一次请求。
再次请求就命中了。
场景二:我们后端server节点还有一个test1.html,如果我们不想让test1.html加入缓存,怎么办?
这里要在vcl_recv中定义。
意义精确匹配,只要是url里最后出现了/test1.html,我们通通把它不予考虑缓存。然后就在命令里键入
varnish> vcl.load first3 ./default.vcl
200
VCL compiled.
varnish> vcl.use first3
200
客户端发起对test1.html的请求。
不管发起几次请求都是miss的。
这里要补充几个关于varnish的内置变量,这几个变量只能用在vcl_hit或vcl_error,且大多为只读)
obj.status
obj.response
obj.ttl
obj.hits等。
系统定义的配置文件,有一项
如何手动清理缓存对象呢?
使用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"?> Purged successful XID: 183182795 Varnish cache server
<!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>
<h3>Guru Meditation:</h3>
<hr>
</body>
</html>
[root@billlee html]#
varnish如何对后端服务器节点进行康检
用.probe的方法
可以对后端主机进行健康检查了。
然后
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还可以代理多个节点,下面是简略规划图:
这步骤需要修改varnish的配置文件,/etc/varnish/default.vcl
定义如下信息:
调度方式是round-robin,图中有个错误round-robin
此外还需要在vcl_recv里面定义set.backend = webs
vcl.load first6 ./default.vcl
vcl.use first6
然后让客户端开始发起请求试一下:
web1这时候拼命刷新还是会被缓存命中的。如果我们请求一个不是index.html的默认页面呢??会不会出现负载均衡的效果呢?
果然是出现了负载均衡的效果。
在varnishadm中使用param.show可以显示varnish中可以调节的参数。param.set 可以直接设置语法是param.set <param> <value>
varnish(1)缓存、代理、负载均衡