########## CDN高速缓存器Varnish ###########
##########################################
主机环境: rhel6 selinux and iptables disabled
实验主机: Server1:172.25.27.1 作为Varnish服务器
Server2:172.25.27.2 作为Apache服务端
Server3:172.25.27.3 作为Apache服务端
一、CDN定义
CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
二、CDN高速缓存器Varnish定义
Varnish是高性能的开源HTTP加速器和反向代理服务器,其采用全新的软件体系机构,和现在的硬件体系紧密结合,与传统的squid相比,varnish具有性能更高、速度更快、管理更加方便等诸多优点。
三、Varnish处理HTTP请求基本流程图
处理过程大致分为如下几个步骤:
(1)Receive 状态(vcl_recv):也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是Pass(vcl_pass)或Pipe(vcl_pipe),或者进入 Lookup(本地查询)。(2)Lookup 状态:进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit (vcl_hit)状态,否则进入 miss (vcl_miss)状态。
(3)Pass 状态(vcl_pass):在此状态下,会进入后端请求,即进入 fetch (vcl_fetch)状态。
(4)Fetch 状态(vcl_fetch):在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储。
Deliver 状态(vcl_deliver):将获取到的数据发送给客户端,然后完成本次请求。
四、Varnish服务器的搭建及配置
在server1操作如下(下文未具体说明则默认在server1中修改):
1.安装
yum install -y varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
2.修改配置文件
######## 配置varnish 服务端口 ########
vim /etc/sysconfig/varnish # 编辑/etc/sysconfig/varnish文件
66 VARNISH_LISTEN_PORT=80 # 改变Varnishi服务端口
######## 配置一个后端服务器 ########
vim /etc/varnish/default.vcl # 编辑/etc/varnish/default.vcl文件7 backend default {
8 .host = "172.25.27.2"; # 主机地址
9 .port = "80"; # 服务端口
/etc/init.d/varnish start # 开启服务
在server2,3操作如下:
yum install -y httpd
/etc/init.d/httpd startcd /var/www/html
vim index.html
<h1>server2</h1> # server2默认发布页面
<h1>server3</h1> # server3默认发布页面
Server2:
Server3:
vim /etc/hosts # 本地解析
172.25.27.1 server1 www.westos.org
curl -I www.westos.org
####### 查看缓存命中情况 #########
vim /etc/varnish/default.vclsub vcl_deliver {
if (obj.hits > 0) { # 为响应添加V-Cache首部,显示缓存是否命中
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
/etc/init.d/varnish reload # 重读配置文件而不用重启varnish服务
测试:
curl -I www.westos.orgX-Cache: MISS from westos cache #未命中
curl -I www.westos.org
X-Cache: HIT from westos cache #命中
###### 通过 varnishadm 手动清除缓存 #######
varnishadm ban.url .*$ #清除所有varnishadm ban.url /index.html #清除 index.html 页面缓存
varnishadm ban.url /admin/$ #清除 admin 目录缓存
测试(真机中):
curl -I www.westos.org
###### 定义多个后端服务器(基于不同域名进行访问) ######
vim default.vclbackend web1 { # 创建后端主机
.host = "172.25.27.2"; # 主机地址
.port = "80"; # 服务端口
}
backend web2 { # 创建后端主机
.host = "172.25.27.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 # 重读配置文件而不用重启varnish服务
测试(真机中):
vim /etc/hosts172.25.27.1 server1 www.westos.org westos.org bbs.westos.org
###### 定义负载均衡及健康检查 ######
vim default.vcl17 director lb round-robin { # 把多个后端聚合为一个组,并检测后端健康状况
18 { .backend = web1; }
19 { .backend = web2; }
20 }
21
22 sub vcl_recv {
23 if (req.http.host ~ "^(www.)?westos.org") { # 根据不同的访问域名,分发至不同的后端主机组
24 set req.http.host = "www.westos.org";
25 set req.backend = lb;
26 return (pass); # 没有return则需手动清理缓存
27 } elsif (req.http.host ~ "^bbs.westos.org") {
28 set req.backend = web1;
29 } else {error 404 "westos cache";
30 }
31 }
/etc/init.d/varnish reload
在server2操作如下:
vim /etc/httpd/conf/httpd.conf # 配置httpd,设置虚拟主机990 NameVirtualHost *:80
1011 <VirtualHost *:80>
1012 DocumentRoot /var/www/html
1013 ServerName server2
1014 </VirtualHost>
1015
1016 <VirtualHost *:80>
1017 DocumentRoot /www/bbs
1018 ServerName bbs.westos.org
1019 </VirtualHost>
1020
1021 <VirtualHost *:80>
1022 DocumentRoot /www/westos
1023 ServerName www.westos.org
1024 </VirtualHost>
mkdir /www/bbs -p
mkdir /www/westos
vim /www/bbs/index.html<h1>server2-bbs.westos.org</h1>
vim /www/westos/index.html
<h1>server2-www.westos.org</h1>
/etc/init.d/httpd restart
vim /etc/hosts
172.25.27.2 server2 bbs.westos.org www.westos.org
在server3操作如下:
vim index.html<h1>server3-www.westos.org</h1>
/etc/init.d/httpd restart
测试(真机中):
访问www.westos.org/index.html在server2,server3两个服务器上进行轮询bbs.westos.org则只访问server1服务器
26 return (pass);
varnishadm ban.url /index.html # 清理缓存
curl www.westos.org/index.html # 在server1中手动清理缓存一次,轮询一次
五、CDN推送平台的搭建
yum install -y httpd # 安装httpd
136 Listen 8080 # 修改httpd服务的监听端口为8080,因为端口80已经被varnish占用
yum install unzip -y
unzip bansys.zip -d /var/www/html/
rm -fr /var/www/html/bansys/
yum install php -y # 需要安装php支持
netstat -antlp # 查看端口
/etc/init.d/varnish reload
vim /var/www/html/config.php # 编辑config.php文件///数据库信息/
//数据库信息
# $host = "localhost"; # 将数据库信息注释
# $user = "";
# $passwd = "";
# $dbname = "bansys";
# $conn = mysql_connect($host, $user, $passwd) or die('Unable to connect database...');
# mysql_select_db($dbname,$conn);
# $query = "select ResourceIP from purgeapp_resource";
# $results = mysql_query($query,$conn);
#
# while ($row=mysql_fetch_row($results)) {
# $varnish_host[] = $row[0];
# }
# mysql_close($conn);
25 //varnish主机列表
26 //可定义多个主机列表
27 $var_group1 = array(
28 'host' => array('172.25.27.1',),
29 'port' => '80',
30 );
35 //varnish群组定义
36 //对主机列表进行绑定
37 $VAR_CLUSTER = array(
38 'www.westos.org' => $var_group1,
39 );
40
41
42 //varnish版本
43 //2.x和3.x推送命令不一样
44 $VAR_VERSION = "3";
bansys 有两种工作模式,分别是:telnet 和 http 模式。
1.telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S ${VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
如果是 http 模式需要对 varnish 做以下设置:
vim /etc/varnish/default.vcl
7 acl westos { # 定义可访问来源IP
8 "127.0.0.1";
9 "172.25.27.0"/24;
10 }
23 sub vcl_recv {
24 if (req.request == "BAN") {
25 if (!client.ip ~ westos) {
26 error 405 "Not allowed.";
27 }
28 ban("req.url ~ " + req.url);
29 error 200 "ban added";
30 }
34 #return (pass);
/etc/init.d/varnish reload
访问172.25.27.1:8080界面如下:
在此界面推送消息,刷新www.westos.org/index.html