一、varinish简介
Varnish是一款高性能的开源HTTP加速器,他的作者Poul-Henning Kamp是FreeBSD的内核开发者之一。挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。
Varnish与一般服务器软件类似,就是一个web缓存代理服务器,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
Management进程主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口等。 Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回 应,Management将会重启此Child进程。
Child进程包含多种类型的线程,常见的如:
Acceptor线程:接收新的连接请求并响应;
Worker线程:child进程会为每个会话启动一个worker线程,因此,在高并发的场景中可能会出现数百个worker线程甚至更多;
Expiry线程:从缓存中清理过期内容;
Varnish依赖“工作区(workspace)”以降低线程在申请或修改内存时出现竞争的可能性。在varnish内部有多种不同的工作区,其中最关键的当属用于管理会话数据的session工作区。
二、VCL简介
Varnish Configuration Language (VCL)是varnish配置缓存策略的工具,它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判 断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。
VCL处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
三、varnish的安装
1、server1中:
1.安装varnish
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
2.更改varnish全局配置
vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80 #更改varnish服务端口为80
3.更改varnish配置文件
vim /etc/varnish/default.vcl
backend default { #配置一个后端服务器
.host = "172.25.4.2"; #更改访问IP为172.25.4.2
.port = "80";
}
4.重新加载服务
/etc/init.d/varnish reload
2、server2中:
1.安装apache
yum install httpd -y
/etc/init.d/httpd start
2.制作index.html
cd /var/www/html
vim index.html
<h1>server2</h1>
3.重新加载服务
/etc/init.d/httpd reload
3、测试:
物理机中打开firefox,访问172.25.4.1,看到server2即配置成功
四、测试缓存命中情况
1、server1中:
1.更改配置文件
vim /etc/varnish/default.vcl
添加
sub vcl_deliver { #查看缓存命中情况
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
2.重新加载服务
/etc/init.d/varnish reload
2、测试:
物理机中:
curl -I 172.25.4.1 第一次显示 MISS from westos cache 缓存中没有,前往后端获取
curl -I 172.25.4.1 第二次显示 HIT from westos cache 缓存中直接获取