Linux---CDN高速缓存器 Varnish

##########################################
########## 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 start
cd /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 www.westos.org

curl -I www.westos.org


此时访问www.westos.org即可看到默认进入的是server2的默认发布页面


####### 查看缓存命中情况 #########

vim /etc/varnish/default.vcl
sub 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.org
X-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.vcl
backend 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/hosts

172.25.27.1 server1 www.westos.org westos.org bbs.westos.org


当访问 www.westos.org 域名时从 web1 也就是server2上取数据,访问 bbs.westos.org 域名时到 web2 也就是server3上取数据,访问其他页面报错。





###### 定义负载均衡及健康检查 ######

vim default.vcl
17 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服务器



注释掉vim default.vcl中的return
26 return (pass);

varnishadm ban.url /index.html # 清理缓存


测试(真机中):

curl www.westos.org/index.html # 在server1中手动清理缓存一次,轮询一次



五、CDN推送平台的搭建

yum install -y httpd # 安装httpd


vim /etc/httpd/conf/httpd.conf # 编辑httpd.conf文件

136 Listen 8080 # 修改httpd服务的监听端口为8080,因为端口80已经被varnish占用


yum install unzip -y


unzip bansys.zip -d /var/www/html/


mv /var/www/html/bansys/* /var/www/html/

rm -fr /var/www/html/bansys/


yum install php -y # 需要安装php支持


/etc/init.d/httpd start # 开启httpd

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



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值