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请求基本流程图

Linux---CDN高速缓存器 Varnish_第1张图片

处理过程大致分为如下几个步骤:

(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

Linux---CDN高速缓存器 Varnish_第2张图片


2.修改配置文件


######## 配置varnish 服务端口 ########
vim /etc/sysconfig/varnish # 编辑/etc/sysconfig/varnish文件
66 VARNISH_LISTEN_PORT=80 # 改变Varnishi服务端口
Linux---CDN高速缓存器 Varnish_第3张图片

Linux---CDN高速缓存器 Varnish_第4张图片


######## 配置一个后端服务器 ########

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 # 开启服务

Linux---CDN高速缓存器 Varnish_第5张图片

Linux---CDN高速缓存器 Varnish_第6张图片

在server2,3操作如下:

yum install -y httpd

/etc/init.d/httpd start
cd /var/www/html
vim index.html

server2

# server2默认发布页面

server3

# server3默认发布页面

Server2:

Linux---CDN高速缓存器 Varnish_第7张图片

Linux---CDN高速缓存器 Varnish_第8张图片


Server3:

Linux---CDN高速缓存器 Varnish_第9张图片

Linux---CDN高速缓存器 Varnish_第10张图片


测试(真机中):
vim /etc/hosts # 本地解析

172.25.27.1 server1 www.westos.org

Linux---CDN高速缓存器 Varnish_第11张图片

curl www.westos.org

curl -I www.westos.org

Linux---CDN高速缓存器 Varnish_第12张图片

此时访问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服务

Linux---CDN高速缓存器 Varnish_第13张图片

Linux---CDN高速缓存器 Varnish_第14张图片

测试:

curl -I www.westos.org
X-Cache: MISS from westos cache #未命中
curl -I www.westos.org
X-Cache: HIT from westos cache #命中
Linux---CDN高速缓存器 Varnish_第15张图片


###### 通过 varnishadm 手动清除缓存 #######

varnishadm ban.url .*$ #清除所有
varnishadm ban.url /index.html #清除 index.html 页面缓存
varnishadm ban.url /admin/$ #清除 admin 目录缓存

Linux---CDN高速缓存器 Varnish_第16张图片

测试(真机中):

curl -I www.westos.org
Linux---CDN高速缓存器 Varnish_第17张图片


###### 定义多个后端服务器(基于不同域名进行访问) ######

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服务

Linux---CDN高速缓存器 Varnish_第18张图片

Linux---CDN高速缓存器 Varnish_第19张图片

测试(真机中):

vim /etc/hosts

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

Linux---CDN高速缓存器 Varnish_第20张图片

当访问 www.westos.org 域名时从 web1 也就是server2上取数据,访问 bbs.westos.org 域名时到 web2 也就是server3上取数据,访问其他页面报错。
Linux---CDN高速缓存器 Varnish_第21张图片

Linux---CDN高速缓存器 Varnish_第22张图片

Linux---CDN高速缓存器 Varnish_第23张图片

Linux---CDN高速缓存器 Varnish_第24张图片


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

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

Linux---CDN高速缓存器 Varnish_第25张图片

Linux---CDN高速缓存器 Varnish_第26张图片

在server2操作如下:

vim /etc/httpd/conf/httpd.conf # 配置httpd,设置虚拟主机
990 NameVirtualHost *:80
1011
1012 DocumentRoot /var/www/html
1013 ServerName server2
1014

1015
1016
1017 DocumentRoot /www/bbs
1018 ServerName bbs.westos.org
1019

1020
1021
1022 DocumentRoot /www/westos
1023 ServerName www.westos.org
1024

mkdir /www/bbs -p

mkdir /www/westos

vim /www/bbs/index.html

server2-bbs.westos.org


vim /www/westos/index.html

server2-www.westos.org


/etc/init.d/httpd restart
vim /etc/hosts
172.25.27.2 server2 bbs.westos.org www.westos.org

Linux---CDN高速缓存器 Varnish_第27张图片

Linux---CDN高速缓存器 Varnish_第28张图片

Linux---CDN高速缓存器 Varnish_第29张图片

Linux---CDN高速缓存器 Varnish_第30张图片

在server3操作如下:

vim index.html

server3-www.westos.org


/etc/init.d/httpd restart

Linux---CDN高速缓存器 Varnish_第31张图片


测试(真机中):

访问www.westos.org/index.html在server2,server3两个服务器上进行轮询
bbs.westos.org则只访问server1服务器

Linux---CDN高速缓存器 Varnish_第32张图片

Linux---CDN高速缓存器 Varnish_第33张图片

Linux---CDN高速缓存器 Varnish_第34张图片

Linux---CDN高速缓存器 Varnish_第35张图片

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

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

Linux---CDN高速缓存器 Varnish_第36张图片

Linux---CDN高速缓存器 Varnish_第37张图片

测试(真机中):

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

Linux---CDN高速缓存器 Varnish_第38张图片



五、CDN推送平台的搭建

yum install -y httpd # 安装httpd

Linux---CDN高速缓存器 Varnish_第39张图片

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

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

Linux---CDN高速缓存器 Varnish_第40张图片

Linux---CDN高速缓存器 Varnish_第41张图片

yum install unzip -y

Linux---CDN高速缓存器 Varnish_第42张图片

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

Linux---CDN高速缓存器 Varnish_第43张图片

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

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


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

Linux---CDN高速缓存器 Varnish_第44张图片

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

netstat -antlp # 查看端口

Linux---CDN高速缓存器 Varnish_第45张图片

/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";

Linux---CDN高速缓存器 Varnish_第46张图片

Linux---CDN高速缓存器 Varnish_第47张图片

Linux---CDN高速缓存器 Varnish_第48张图片

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

Linux---CDN高速缓存器 Varnish_第49张图片

Linux---CDN高速缓存器 Varnish_第50张图片

Linux---CDN高速缓存器 Varnish_第51张图片

测试:

访问172.25.27.1:8080界面如下:

Linux---CDN高速缓存器 Varnish_第52张图片

在此界面推送消息,刷新www.westos.org/index.html

Linux---CDN高速缓存器 Varnish_第53张图片

Linux---CDN高速缓存器 Varnish_第54张图片

Linux---CDN高速缓存器 Varnish_第55张图片

你可能感兴趣的:(Linux-企业)