一、varnish简介
Varnish是一款高性能的开源HTTP加速器,他的作者Poul-Henning Kamp是FreeBSD的内核开发者之一。挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。
Varnish与一般服务器软件类似,就是一个web缓存代理服务器,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
二、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.环境:
实验主机(需要三台虚拟机,如下分别说明主机名,ip以及所要安装的服务):
server1 172.25.35.1 varnish
server2 172.25.35.2 apache
server3 172.25.35.3 apache
2.varnish部署
1.下载安装varnish软件包(server1上)
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
2. 修改监听端口为80(与http端口冲突可修改http端口为8080)
vi /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80
3.更改varnish配置文件,配置一个后端服务器,并重新加载服务
vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.35.2";
.port = "80";
}
/etc/init.d/varnish start
4.在server2上安装apache,并编写测试页
yum install httpd -y
/etc/init.d/httpd start
vim /var/www/html/index.html
<h1>server2</h1>
注意:以后只要修改过配置文件就要reload,或者restart,不然会导致实验过程中出现错误。
6.测试(物理机/etc/hosts上要有server2的解析)
172.25.35.1
可以看到访问的是172.25.35.1得到是后端服务器http的发布网页的内容。
四、测试缓存命中情况
1.修改server1的配置文件即可
vim /etc/varnish/default.vcl ## varnish配置文件
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
3.测试
cul -I www.westos.org
第一次显示 MISS from westos cache 缓存中没有,前往后端获取
第二次显示 HIT from westos cache 缓存中直接获取
补充varnish的工作原理:请求varnish服务器的过程是首先查看自己的缓存区,如果命中,如果有则直接返回给请求者,若没有则去后端服务器去取数据,将取到的数据复制到缓存区,并且返回给请求者,这样如果有连续的相同请求,则不用再去后端服务器取数据,在varnish服务器的缓存区即可命中返回,减小了后端服务器的压力。varnish服务器的缓存区的默认保存时间是120秒,超过时间会清空。可根据实际的需求在varnish的配置文件中进行修改数据的保存时间。
4.通过varnishadm手动清除缓存
varnishadm ban.url .*$ #清除所有
varnishadm ban.url /index.html #清除页面缓存
varnishadm ban.url /admin/$ #清除目录缓存
这三条命令可根据实际的需求选择合适的命令来清除varnish服务器的缓存。
注意:
这里要注意一个小的方面:
使用curl -I 172.25.4.1访问和使用curl -I 172.25.4.1/index.html访问,得到的结果是一样的,但是这两条命令会在缓存区生成两条不同的缓存。
若你执行了清除页面缓存的命令后在执行curl -I 172.25.4.1也会显示命中,而执行curl -I 172.25.4.1/index.html会显示不命中。
五、定义多个不同站点的后端服务器
1.配置后端服务器(server1上在原先的配置上再添加一个后端服务器)
vim /etc/varnish/default.vcl ## 配置文件
backend web1 {
.host = "172.25.35.2";
.port = "80";
}
backend web2 {
.host = "172.25.35.3";
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = web1;
return(pass)
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
/etc/init.d/varnish reload ## 重启服务
2.依次类推,仿照server2的设置,在每个后端服务器上安装http并编写测试页面
这里又添加了一个后端服务器server3 配置如下:
vim /var/www/html/index.html
<h1>server3</h1>
3.测试(在测试的物理机器上要对新添加的后端服务器进行解析)
vim /etc/hosts
测试结果:
六、定义负载均衡和健康检查
1.配置后端服务器
vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.35.2";
.port = "80";
}
backend web2 {
.host = "172.25.35.3";
.port = "80";
}
director lb round-robin {
#把多个后端聚合为一个组,并检测后端健康状况
{ .backend = web1; }
{ .backend = web2; }
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
} elsif (req.http.host ~ "^www.linux.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
测试结果:
注:在配置这里,还可以更改server1中varnish配置文件,在set req.backend = lb;下添加return (pass); 使得varnish缓存功能失效,客户端直接去后端抓取内容,可以获得更好的测试对比效果。
注:此时若server2的httpd服务关闭curl会一直读取server3相应的index.html内容而不会报错,这是因为varnish拥有自动的健康检查功能,
/etc/init.d/httpd stop
打开server2的http服务后,varnish服务器的健康检查功能自动又将server2添加,使用curl又能够循环读取到server2和server3相应的index.html内容
七、varnish cdn推送平台
1.首先server1上需要安装apache服务,
yum install httpd -y
修改http的访问端口为8080,避免与varnish服务器的端口冲突。
vim /etc/httpd/conf/httpd.conf
LISTEN 8080
更改完成后重启服务即可
2.server1上需要安装php
yum install php -y
编写配置文件,只保留如下内容
cd /var/www/html
vim config.php
<?php
$var_group1 = array(
'host' => array('172.25.35.1'),
'port' => '6082',
);
//varnish 群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish 版本//2.x 和 3.x 推送命令不一样
$VAR_VERSION = "3";
?>
3.下载bansys.zip包,并进行解压
yum install unzip -y
unzip bansys.zip -d /var/www/html
4.bansys 有两种工作模式,分别是:telnet 和 http 模式。
telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的
“ -S ${VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可
如果是 http 模式需要对 varnish 做以下设置(本次试验采用http模式推送)
如下为http模式的设定:
更改varnish的配置文件
vim /etc/varnish/default.vcl
acl westos {
#设置访问控制
"127.0.0.1";
"172.25.35.1"/24;
}
sub vcl_recv {
if (req.request == "BAN") {
if (!client.ip ~ westos) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}
重新加载varnish服务
/etc/init.d/varnish reload
5.测试
物理机中:
用firefox访问www.westos.org
打开另外一个网页,用firefox访问 172.25.35.1:8080
推送模式:HTTP
CDN群组:www.westos.org
推送内容:
/index.html # 推送文件
/images/* # 目录
本次试验推送文件 /index.html
推送一次后,再访问172.25.4.1:8080一次,发现循环读取到server2和server3相应的index.html内容