#######################相关概念
1.什么是cdn?
CDN的全称是Content Delivery Network,即内容奋发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,cdn系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
CDN(Content Delivery Network)是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
搭建CDN系统可以选择3种主流方案:
1. squid 2. varnish 3. Nginx+memcache
2.什么是varnish?
Varnish 的作者Poul-Henning。
Varnish是一款高性能的开源HTTP加速器 ,挪威最大的在线报纸 Verdens Gang使用3台Varnish代替了原来的12台Squid 。而性能甚至比以前更好。
Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。
但现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是Varnish cache设计架构。
工作过程
<1>初始化过程
Varnish 的master进程负责启动工作,master进程读取配置文件,根据指定的空间大小来创建存储空间,创建并管理child进程。child进程来处理后续任务,它会分配一些线程来执行不同的工作,例如:接受http请求;为缓存对象分配存储空间;清除过期缓存对象;释放空间碎片整理等。
<2>http请求处理过程
有一个专门负责接收http请求的线程,一直监听请求端口,当有请求过来时,负责唤起一个工作线程来处理请求。工作线程会分析http请求的uri,知道了这个请求想要什么,就到缓存中查找是否有这个对象。如果有,就把缓存对象直接返回给用户;如果没有,会把请求转给后端服务器处理,并等待结果。工作线程从后端得到结果内容后,先把内容作为一个缓存对象保存到缓存空间(以备下次请求这个对象时快速响应),然后再把内容返回给用户。
<3>分配缓存过程
有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去。如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块。如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则。
<4>释放缓存过程
有一个线程来负责缓存的释放工作,它定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间。释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合 。
3.怎样用varnish实现cdn?
在当前主流的Web架构中,Cache担任着越来越重要的作用。常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键。而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server。严格意说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器。同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一。
VCL (Varnish Configuration Language)处理流程图
处理过程大致分为如下几个步骤:
(1)Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass或Pipe,或者进入 Lookup(本地查询)。
(2)Lookup状态,进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入miss状态。
(3)Pass状态,在此状态下,会进入后端请求,即进入fetch状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
###############2.使用varnish部署CDN节点集群
实验环境:
三台redhat6.5版本虚拟机+一台物理机;
server1:172.25.9.1
server2:172.25.9.2
server3:172.25.9.3
Client:172.25.9.250
当varnish上面没有缓存数据时:
当varnish上面有缓存数据时:
将scp命令装在真机上
[root@server9~]# yum provides */scp —查找软件包
[root@server9 ~]# yum install openssh-clients-5.3p1-94.el6.x86_64 -y
[root@foundation68 ~]# scp /home/kiosk/Desktop/*.rpm root@172.25.9.1:/root
一.配置varnish服务器。
在server1端:
(1)下载并安装varnish软件包
http://varnish-cache.org/releases/
安装包: varnish-3.0.5-1.el6.x86_64.rpm
varnish-libs-3.0.5-1.el6.x86_64.rpm
(2)修改varnish的监听端口
[root@server1 ~]# vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80 # 设置为监听80端口
(3)修改安全限制文件(保证流量大时,服务正常运行)
打开文件的最大数,有如下关系:内核操作> 操作系统> 软件
内核允许的打开文件最大数:
[root@server1 ~]# sysctl -a |grep file
fs.file-nr = 416 0 98862
fs.file-max = 98862
varnish软件允许打开的最大文件数:vim /etc/sysconfig/varnish
我们可以看到varnish打开的文件数比内核能够操作的默认数量大,因此要改小。
而操作系统允许的最大文件数应介于内核与varnish软件之间,因此:
[root@server1 ~]# vim /etc/security/limits.conf
varnish – nofile 96667
varnish – memlock 82000
varnish – nproc unlimited
(4)修改默认配置文件
[root@server1 ~]# vim /etc/varnish/default.vcl (端口改为网络服务器的IP,可以是server2的ip)
(5)开启服务
[root@server1 ~]# /etc/init.d/varnish start
(6)检测varnish服务端口是否打开:netstat -antlp
在server2主机上:
[root@server2 ~]# yum install httpd -y # 下载httpd
[root@server2 ~]# /etc/init.d/httpd start #开启httpd服务
[root@server2 ~]# cd /var/www/html
[root@server2 html]# vim index.html #写入解析
写入:server2
在物理主机上:
浏览器中输入varnish服务器的ip地址(172.25.9.1),访问到解析。
注意:在实验中虚拟机和真机的火墙都要关闭,并且varnish服务器(server1)要关闭httpd服务。
小结:网页测试出问题有以下几种情况:
1.没有开启httpd服务,没有关闭火墙;
2.配置文件内IP或内容编写错误;;
3.未刷新varnish服务;
4.如果以上都正确,需将varnish服务先关闭,再开启,再次刷新即可。
二.查看缓存命中情况
(1)在server1(varnish服务端)
[root@server1 varnish]# vim default.vcl
写入:
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);
}
[root@server1 varnish]# /etc/init.d/varnish restart —重启服务
(2)在客户端(真机)添加本地解析
写入:172.25.7.1 www.westos.org
(3)在真机添加本地解析后就可以进行访问测试。
注意:varnish的默认缓存时间为120s,超过120s就会自动清除缓存。
我们也可以通过varnishadm手动清除缓存。
在varnish服务端(server1)清除缓存,然后在客户端(真机)进行测试。
varnishadm ban.url .*#清除所有
varnishadm ban.url /index.html #清除 index.html 页面缓存
varnishadm ban.url /admin/ #清除所有 varnishadm ban.url /index.html #清除 index.html 页面缓存 varnishadm ban.url /admin/ #清除 admin 目录缓存
三.定义多个不同域名站点的后端服务器
在server1(varnish服务端)主机上:
(1)修改默认源代码为:
[root@server1 varnish]# cd /etc/varnish
[root@server1 varnish]# vim default.vcl
修改为:
backend web1 { .host = "172.25.7.2" .port = "80" } backend web2 { .host = "172.25.7.3" .port = "80" } 当访问 www.westos.org或者westos.com 域名时从 web1 上取数据, ## 访问 bbs.westos.org 域名时到 web2 取数据,访问其他页面报错。 sub vcl_recv { if (req.http.host ~ "^(www.)?westos.org") { set req.http.host = "www.westos.org" set req.backend = web1 } elsif (req.http.host ~ "^bbs.westos.org") { set req.backend = web2 } else {error 404 "westos cache" } }
(2)重新加载varnish软件服务。
[root@server1 varnish]# /etc/init.d/varnish reload #刷新varnish
在主机server2:配置网络服务器
(1)开启httpd服务,编写测试页并重启服务
root@server2 ~]# vim /var/www/html/index.html
在server3:配置网络服务器
安装并开启httpd服务,编写默认发布界面
vim /var/www/html/index.html
在物理主机上:
[root@foundation9 images]# vim /etc/hosts #写入解析 172.25.9.1 www.westos.org bbs.westos.org
测试:
四.负载均衡和健康状况
负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。
在后端服务器server3上:
(1)安装http并启动服务;
yum install httpd -y /etc/init.d/httpd start
(2)修改配置文件,打开基于域名的虚拟主机选项 NameVirtualHost *:80。
vim /etc/httpd/conf/httpd.conf VirtualHost *:80> -----打开80端口 DocumentRoot /www1 ServerName www.westos.com </VirtualHost> <VirtualHost *:80> DocumentRoot /var/www/html ServerName bbs.westos.com </VirtualHost>
(3)重启httpd服务
/etc/init.d/httpd restart
(4)写入缓存内容
[root@server3 html]# mkdir /www1
[root@server3 html]# cd /www1
[root@server3 www1]# vim index.html
写入: www.westos.org – server3
[root@server3 www1]# vim /etc/hosts
在server2主机上:
[root@server2 html]# vim /var/www/html/index.html
www.westos.org – server2
在server1主机(后端服务器)上:
[root@server1 varnish]# cd /etc/varnish
[root@server1 varnish]# vim default.vcl
backend web1 { .host = "172.25.9.2" .port = "80" } backend web2 { .host = "172.25.9.3" .port = "80" } ## 把多个后端聚合为一个组,并检测后端健康状况 ## Round Robin(中文翻译为轮询调度)是一种以轮询的方式依次将一个域名 ## 解析到多个IP地址的调度不同服务器的计算方法。 director lb round-robin { ##定义负载均衡,lb为名称可以自定义 {.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 return (pass) } elsif (req.http.host ~ "^bbs.westos.org") { set req.backend = web2 } else {error 404 "westos cache" }
[root@server1 varnish]# /etc/init.d/varnish reload #刷新
[root@server1 varnish]# varnishadm ban.url /index.html #清空index.html页面缓存120后从0开始
在server3上进行测试:
在物理主机上进行测试:
(1)网页中测试。
(2)终端命令测试。
注意:
在/etc/varnish/default.vcl中写入return(pass)是为了测试方便,不进行缓存的
不加return(pass)说明一个网址是会缓存120秒的,若120后再次访问会重新缓存。
在实验中物理机和虚拟机的火墙要关闭,httpd服务要打开。若stop掉server2或server3的httpd,再测试时,会只访问正常的服务器,这就证明了varnish具有健康检查的功能。
五.搭建CDN推送平台。
server1:推送平台
(1)开启httpd服务及varnish服务。
(2)因为varnish占用的80端口,所以修改httpd的端口为8080
root@server1 ~]
(3)重启httpd服务。
/etc/init.d/httpd restart
(4)下载并压缩bansys包及安装服务,把解压后的文件放入apache默认发布目录 。
[root@server1 ~] [root@server1 ~] root@server1 ~] [root@server1 ~] [root@server1 html] [root@server1 html] [root@server1 bansys] [root@server1 bansys] [root@server1 bansys] [root@server1 html] [root@server1 html]
(5)网页访问172.25.9.1:8080
注意:bansys 有两种工作模式,分别是:telnet 和 http 模式。
【1】telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
【2】 如果是 http 模式需要对 varnish 做以下设置:
(6)客户端测试
1.在物理主机上先看到的是没有推送平台的访问网址()
2.访问172.25.9.1:8080 (server1主机IP)
3.开始推送
4.返回物理主机查看,发现网址有了改变
以此类推,每推送一次,就会将网址更新一次
原文链接:https://blog.csdn.net/chao199512/article/details/81323368?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165934461816782248533296%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165934461816782248533296&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-15-81323368-null-null.nonecase&utm_term=%E6%90%AD%E5%BB%BAcdn
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/8249