CDN的全称——Content Delivery Network,即内容分发网络。
其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决
Internet网络拥挤的状况,提高用户访问网站的响应速度。 Varnish是一款高性能的开源HTTP加速器,具有反向代理,缓存的功能。
主机环境: rhel6 selinux and iptables disabled
实验主机:
172.25.75.1 varnish
172.25.75.2 apache
172.25.75.3 apache
一.部署单个后端服务器的varnish过程
1.在官网下载varnish-libs-3.0.5-1.el6.x86_64.rpm和varnish-3.0.5-1.el6.x86_64.rpm
yum install varnish-libs-3.0.5-1.el6.x86_64.rpm
yum install varnish-3.0.5-1.el6.x86_64.rpm
安装完成后,在系统的/etc/passwd中生成varnish用户,对varnish的访问控制实质上是对varnish用户的控制实现的。
2.编辑varnish文件
vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80
#将66行改为:VARNISH_LISTEN_PORT=80
# 以下不用修改,只是查看
第8行 NFILES=131072 # 最多能打开的文件数,varnish会自动调整该值
第12行 MEMLOCK=82000 # 最多能使用的内存空间,varnish会自动调整该值
第15行 NPROCS="unlimited" # 单个用户所能运行的最大线程数
3.修改varnish用户的限制文件
因为varnish这个程序运行在varnish这个用户的私有空间内,内核对普通用户限制的最大文件数为1024.对varnish用户限制的最大文件数为131072,我们需要满足131072这个最大值。
vim /etc/security/limits.conf
varnish - nofile 131072 # 满足最多能打开的文件数
varnish - memlock 82000
varnish - nproc unlimited
# 将后边的数字和上边文件中对应项改为相等
4.打开varnish服务
/etc/init.d/varnish start
5.在varnish默认文件中写上后端服务器的IP及端口
vim /etc/varnish/default.vcl
backend default {
.host = "172.25.75.2"; # 后端服务器的ip
.port = "80"; # 后端服务器的端口
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
# 在varnish中命中HIT访问的域名
}
else {
set resp.http.X-Cache = "MISS from westos cache";
# 后端服务器中得到MISS访问的域名
}
return (deliver);
}
5.编写配置文件后要重新加载默认文件
/etc/init.d/varnish reload ##必须步骤
6.在物理机中的/etc/hosts中写www.westos.org的解析—>172.25.75.1(varnish主机)
172.25.75.1 server1 www.westos.org bbs.westos.org
在server2(后端服务器)中安装httpd服务并在Apach默认发布目录中写默认发布文件
7.在物理机中测试:
curl www.westos.org
curl -I www.westos.org
第一次访问
第二次访问
此时间为缓存时间,可在配置文件中改变
二.具有多台后端服务器的varnish
1.配置vm3虚拟机并打开,配置ip和主机名为172.25.75.3->server3
vim /etc/sysconfig/network
HOSTNAME=server3
2.安装httpd服务,在httpd的默认发布目录下编辑默认发布文件index.html
bbs.server3.com
3.将bbs解析到物理主机 bbs.westos.org 172.25.75.1
之前的实验已经做过了
4.配置varnish的server1default文件
vim /etc/varnish/default.vcl
backend web1 { # 后端第一个服务器名web1
.host = "172.25.1.2";
#将server2 www.westos.org作为第一个服务器主机
.port = "80";
}
backend web2 { # 后端第二个服务器名web2
.host = "172.25.1.3"
#将server3 bbs.westos.org作为第二个服务器主机
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
# 解析域名是westos.com 或www.westos.com,均访问172.25.1.2->server2
set req.http.host = "www.westos.org";
set req.backend = web1;
} elsif (req.http.host ~ "^bbs.westos.org") {
# 解析域名为bbs.westos.com,访问172.25.1.3->server 3
set req.backend = web2;
} else {error 404 "westos cache";
# 如果访问的域名不是这三者,404的错误
}
}
default文件每次编写完后都要reload varnish
/etc/init.d/varnish reload
5.物理机中的访问测试:
三.varnish后端服务器的负载均衡
1.什么是负载均衡,为什么要负载均衡
负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。
负载均衡算法的种类有很多种,常见的负载均衡算法包括轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法等,应根据具体的使用场景选取对应的算法。在varnish中我们采用的是轮询法,平衡对待每一个后端服务器。
2.在server3的httpd的默认发布目录中建立两个虚拟主机
vim /etc/httpd/conf/httpd.conf
****
990 NameVirtualHost *:80
1012 <VirtualHost *:80>
1013 DocumentRoot /www
1014 ServerName www.westos.org
1015 </VirtualHost>
1016
1017 <VirtualHost *:80>
1018 DocumentRoot /bbs
1019 ServerName bbs.westos.org
1020 </VirtualHost>
****
/etc/init.d/httpd restart ##重启服务
在server3默认发布目录中书写
<h1>www.server3.com</h1>
在server2默认发布目录中书写
<h1>www.server2.com</h1>
4.4.在varnish主机server1中的defaults文件中写入负载均衡函数:
director lb round-robin { # 采用round-robin算法
{ .backend = web1; }
{ .backend = web2; }
}
Round Robin(中文翻译为轮询调度)是一种以轮询的方式依次将一个域名解析到多个IP地址的调度不同服务器的计算方法。
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb; # 调用平衡轮叫函数
#return (pass); # 写pass表明不经过缓存直接去后端服务器拿数据
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
##为了实验现象,需要return (pass)
5.在物理主机中的测试
curl www.westos.org
如果第一次出现server2(server3),那么120秒(默认)内都是server2(萨尔ver),因为server2(server3)将数据进行了缓存;
如果访问时间大于120s,它会出现server3(server2)(因为负载均衡采用的算法是平衡轮叫,server2和server3是公平地被访问的)
如果在默认函数中写上pass,那么它每次都直接从后端服务器中直接取,一次server2一次server3
如果server2或者server3其中一个损坏(关闭htpd服务),那么客户端只会访问健康的那一个,不会访问坏的哪一个,即负载均衡的健康检查。
正常情况下
当server3的http关掉之后测试
健康检查:
通过健康检查来确定服务器和应用的健康状况是负载均衡器器一个非常重要的功能。没有负载均衡器,客户端可能会将请求发送到已经停机的服务器上。网络管理员必须手动干预替换这台服务器,或者排除服务器的故障。有时服务器可能没有停机,但是因为某种原因,比如软件的漏洞,服务器上面运行的应用系统已经不能正常工作。比如Web应用可能正常运行,但它返回的页面却是错误的内容。负载均衡器能够检测这些情况并立即将客户请求导向到正常的服务器而不需要管理员的干预。
四.CDN推送
CDN推送:当后端服务器中的DNS有更新时,在varnish的缓存中应该及时同步后端服务中的内容
1.在server1中下载httpd服务并编辑配置文件,将136行的端口改为8080
(因为我们的varnish服务已经占用了80端口,避免冲突)
vim /etc/httpd/conf/httpd.conf
136 Listen 8080
/etc/init.d/httpd restart
2.安装php(显示页面) ,unzip
yum install php -y
yum install unzip -y
3.从已知获取软件安装包bansys.zip,并解压到/var/www/html
4.编写配置文件
vim config.php
****
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('172.25.12.1'),
'port' => '8080',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
****
5.在server1中打开httpd服务,在浏览器中输入172.25.12.1:8080
出现界面
6.在server1中编写varnish的默认文件
vim /etc/varnish/default.vcl
****
acl westos {
#设置访问控制,即白名单,允许本机和172.25.1网段和推送
"127.0.0.1";
"172.25.75.0"/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";
}
}
****
/etc/init.d/varnish reload
7.测试:
##将之前的pass注释掉
在已显示页面,选择http方式
输入
.*$
在缓存之后,没有清除前
在清除之后—>
完成手动更新