一.CDN简介

CDN(Content Delivery Network)是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。

搭建CDN系统可以选择3种主流方案:

  • squid
  • varnish
  • Nginx+memcache

本文选用varnish搭建CND节点集群。

二、varnish简介

1.基本介绍

Varnish是高性能开源的反向代理服务器和HTTP缓存服务器,Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存。

Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,所以Varnish要相对更高效,但也有缺点,内存中的缓存在服务器重启后会丢失

2.工作过程

<1>初始化过程

Varnish 的master进程负责启动工作,master进程读取配置文件,根据指定的空间大小来创建存储空间,创建并管理child进程。child进程来处理后续任务,它会分配一些线程来执行不同的工作,例如:接受http请求;为缓存对象分配存储空间;清除过期缓存对象;释放空间碎片整理等/

<2>http请求处理过程

有一个专门负责接收http请求的线程,一直监听请求端口,当有请求过来时,负责唤起一个工作线程来处理请求。工作线程会分析http请求的uri,知道了这个请求想要什么,就到缓存中查找是否有这个对象。如果有,就把缓存对象直接返回给用户;如果没有,会把请求转给后端服务器处理,并等待结果。工作线程从后端得到结果内容后,先把内容作为一个缓存对象保存到缓存空间(以备下次请求这个对象时快速响应),然后再把内容返回给用户。

cdn 技术架构图 cdn架构搭建_varnish


<3>分配缓存过程

有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去。如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块。如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则。

<4>释放缓存过程

有一个线程来负责缓存的释放工作,它定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间。释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合为一个更大的空闲块,实现空间碎片的整理。

三、Varnish搭建CDN节点集群

部署环境:

三台redhat6.5版本虚拟机+一台物理机;
server1:172.25.51.1
server2:172.25.51.2
server3:172.25.51.3
Client:172.25.51.250

实验一:Varnish服务器的搭建及配置

cdn 技术架构图 cdn架构搭建_CDN_02


Server1:

<1>下载并安装varnish软件包

lftp 172.25.51.250:/pub> get varnish-3.0.5-1.el6.x86_64.rpm 
lftp 172.25.51.250:/pub> get varnish-libs-3.0.5-1.el6.x86_64.rpm
[root@server1 ~]# yum install * -y

cdn 技术架构图 cdn架构搭建_负载平衡_03


<2>修改varnish监听的端口

[root@server1 ~]# vim /etc/sysconfig/varnish
 66 VARNISH_LISTEN_PORT=80                     ##80端口

cdn 技术架构图 cdn架构搭建_安全检查_04


<3>修改配置文件

[root@server1 ~]# vim /etc/varnish/default.vcl   ##后端默认为server2

cdn 技术架构图 cdn架构搭建_负载平衡_05


<4>开启服务

[root@server1 ~]# /etc/init.d/varnish start

Server2:后端服务器
下载httpd服务,编写测试页并开启httpd服务

[root@server2 ~]# vim /var/www/html/index.html

示图1:测试页内容

cdn 技术架构图 cdn架构搭建_负载平衡_06


示图2:检测测试页

cdn 技术架构图 cdn架构搭建_varnish_07


Client:客户端测试

客户端访问server1进行测试

cdn 技术架构图 cdn架构搭建_varnish_08


cdn 技术架构图 cdn架构搭建_安全检查_09


补充:

<1>当server2的httpd服务关闭后,client可从缓存中获取apache服务,默认缓存时间为120s,120s后连接关闭,Age=0.

cdn 技术架构图 cdn架构搭建_CDN_10


<2>/etc/passwd中存在varnish用户,修改安全限制文件,保证流量大时,服务正常运行

cdn 技术架构图 cdn架构搭建_cdn 技术架构图_11

vim /etc/security/limits.conf    ##对varnish用户进行限制

cdn 技术架构图 cdn架构搭建_cdn 技术架构图_12


实验二:查看缓存命中情况

Sever1:

[root@server1 ~]# vim /etc/varnish/default.vcl
[root@server1 ~]# /etc/init.d/varnish reload  ##重读配置文件

示图:配置文件

cdn 技术架构图 cdn架构搭建_负载平衡_13

示图:reload重读

cdn 技术架构图 cdn架构搭建_负载平衡_14


Client:客户端测试

示图1:第一次访问MISS未命中

cdn 技术架构图 cdn架构搭建_varnish_15


示图2:后续访问HIT命中

cdn 技术架构图 cdn架构搭建_安全检查_16


示图3:varnish默认缓存时间120s,超过120s自动清除缓存

cdn 技术架构图 cdn架构搭建_varnish_17

实验三:通过varnishadm手动清除缓存
varnishadm ban.url .*$         ##清除所有
varnishadm ban.url /index.html ##清除 index.html 页面缓存
varnishadm ban.url /admin/$    ##清除 admin 目录缓存
1.清除所有缓存

Server1:清除所有缓存

cdn 技术架构图 cdn架构搭建_varnish_18


Client:客户端测试

示图1:清除缓存前

cdn 技术架构图 cdn架构搭建_安全检查_19


示图2:清除缓存后

cdn 技术架构图 cdn架构搭建_CDN_20

2.清除index.html 页面缓存

Server1:清除所有缓存

cdn 技术架构图 cdn架构搭建_CDN_21


Client:客户端测试

示图1:清除缓存前

cdn 技术架构图 cdn架构搭建_CDN_22


示图2:清除缓存后

cdn 技术架构图 cdn架构搭建_安全检查_23

实验四: 定义多个后端服务器

Server1:

[root@server1 ~]# vim /etc/varnish/default.vcl
##定义多个不同域名站点的后端服务器
backend web1 {
  .host = "172.25.51.2";
  .port = "80";
}

backend web2 {
  .host = "172.25.51.3";
  .port = "80";
}
#当访问 www.westos.org 域名时从 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";
}
}

[root@server1 ~]# /etc/init.d/varnish reload  ##重读配置文件

示图:配置文件

cdn 技术架构图 cdn架构搭建_安全检查_24


Server2:

开启httpd服务,编写测试页并重启服务

[root@server2 ~]# vim /var/www/html/index.html

示图:测试页内容

cdn 技术架构图 cdn架构搭建_负载平衡_06

Server3:
开启httpd服务,编写测试页并重启服务

[root@server3 ~]# vim /var/www/html/index.html

示图:测试页内容

cdn 技术架构图 cdn架构搭建_varnish_26


物理机:域名解析

[root@foundation51 ~]# vim /etc/hosts

cdn 技术架构图 cdn架构搭建_varnish_27


测试:

<1>物理机浏览器

cdn 技术架构图 cdn架构搭建_负载平衡_28


cdn 技术架构图 cdn架构搭建_varnish_29


cdn 技术架构图 cdn架构搭建_cdn 技术架构图_30


cdn 技术架构图 cdn架构搭建_varnish_31


<2>客户端:物理机

cdn 技术架构图 cdn架构搭建_安全检查_32

实验五:负载均衡及健康检查

Server1:

[root@server1 ~]# vim /etc/varnish/default.vcl
backend web1 {
  .host = "172.25.51.2";
  .port = "80";
}
backend web2 {
  .host = "172.25.51.3";
  .port = "80";
}
## 把多个后端聚合为一个组,并检测后端健康状况
director lb round-robin {
{       .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; ##访问www.XX时,分发至后端轮询组
return (pass);        ##为测试方便,不进行缓存
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
[root@server1 ~]# /etc/init.d/varnish reload

示图:配置文件

cdn 技术架构图 cdn架构搭建_cdn 技术架构图_33

Server2:
编辑轮询测试页面

[root@server2 ~]# vim /var/www/html/index.html 
[root@server2 ~]# /etc/init.d/httpd restart

示图:测试页内容

cdn 技术架构图 cdn架构搭建_cdn 技术架构图_34

Server3:设定为虚拟主机
<1>设置虚拟主机

[root@server3 ~]# vim /etc/httpd/conf/httpd.conf 
[root@server3 ~]# /etc/init.d/httpd restart

示图:配置文件

cdn 技术架构图 cdn架构搭建_安全检查_35


cdn 技术架构图 cdn架构搭建_varnish_36


<2>虚拟主机—轮询测试页

[root@server3 ~]# mkdir /www
[root@server3 ~]# cd /www/
[root@server3 www]# vim index.html

示图:测试页内容

cdn 技术架构图 cdn架构搭建_安全检查_37


<3>为方便本机测试虚拟主机,做域名解析

[root@server3 ~]# vim /etc/hosts

cdn 技术架构图 cdn架构搭建_varnish_38


示图:本机测试结果

cdn 技术架构图 cdn架构搭建_cdn 技术架构图_39

Client:物理机

测试1:负载均衡

<1>浏览器测试页面轮询

cdn 技术架构图 cdn架构搭建_负载平衡_40


cdn 技术架构图 cdn架构搭建_负载平衡_41


<2>shell测试轮询

cdn 技术架构图 cdn架构搭建_安全检查_42


测试2:

当Server2的httpd服务停止时,即

[root@server2 ~]# /etc/init.d/httpd stop

物理机测试:

cdn 技术架构图 cdn架构搭建_cdn 技术架构图_43


补充:
若注释掉Server1中配置文件的return (pass);,需要手动清理缓存。
如下:
Server1:
<1>注释

[root@server1 ~]# vim /etc/varnish/default.vcl
[root@server1 ~]# /etc/init.d/varnish reload

示图:注释return (pass);

cdn 技术架构图 cdn架构搭建_CDN_44


<2>手动清空缓存

[root@server1 ~]# varnishadm ban.url /index.html

cdn 技术架构图 cdn架构搭建_CDN_45


物理机:server1中手动清理缓存一次,轮询一次

cdn 技术架构图 cdn架构搭建_负载平衡_46


实验六:CDN推送平台的搭建

Server1:
<1>安装httpd服务

[root@server1 ~]# yum install httpd -y

<2>修改httpd服务的监听端口为8080,因为端口80已经被varnish占用

[root@server1 ~]# vim /etc/httpd/conf/httpd.conf

示图:端口修改为8080

cdn 技术架构图 cdn架构搭建_负载平衡_47


<3>下载软件

lftp 172.25.51.250:/pub> get bansys.zip 
[root@server1 ~]# yum install unzip -y     ##为解压准备
[root@server1 ~]# unzip bansys.zip

cdn 技术架构图 cdn架构搭建_安全检查_48


<4>将解压后的文件放入apache默认发布目录

cdn 技术架构图 cdn架构搭建_varnish_49


<5>安装php服务

[root@server1 html]# yum install php -y

<6>修改配置文件

[root@server1 html]# vim config.php    ##删除或注释数据库部分内容

cdn 技术架构图 cdn架构搭建_cdn 技术架构图_50


<7>开启httpd服务

[root@server1 html]# /etc/init.d/httpd start

<8>物理机浏览器访问

cdn 技术架构图 cdn架构搭建_varnish_51


bansys 有两种工作模式:telnet 模式http 模式

1. telnet 模式需要关闭 varnish服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S ${VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。

2. http 模式需要对 varnish 做以下设置:

[root@server1 ~]# vim /etc/varnish/default.vcl
acl westos {                     ##定义可访问来源ip
"127.0.0.1";
"172.25.51.0"/24;                ##网段
}

backend web1 {
  .host = "172.25.20.2";
  .port = "80";
}

backend web2 {
  .host = "172.25.20.3";
  .port = "80";
}

director lb round-robin {
{       .backend = web1;        }
{       .backend = web2;        }
}


sub vcl_recv {

if (req.request == "BAN") {
if (!client.ip ~ westos) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}

if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}

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 html]# /etc/init.d/varnish reload  ##重新加载服务

示图:配置文件

cdn 技术架构图 cdn架构搭建_负载平衡_52


物理机测试:1.选择CDN群组:www.westos.org

<1>访问172.25.27.1:8080界面,推送内容/index.html

cdn 技术架构图 cdn架构搭建_安全检查_53


<2>提交推送内容

cdn 技术架构图 cdn架构搭建_cdn 技术架构图_54


<3>刷新www.westos.org/index.html,查看推送消息

cdn 技术架构图 cdn架构搭建_cdn 技术架构图_55


cdn 技术架构图 cdn架构搭建_cdn 技术架构图_56


2.选择CDN群组:bbs.westos.org

<1>更改测试页内容

[root@server3 ~]# vim /var/www/html/index.html

cdn 技术架构图 cdn架构搭建_负载平衡_57

<2>访问172.25.27.1:8080界面,推送内容/index.html

cdn 技术架构图 cdn架构搭建_负载平衡_58


<3>提交推送内容

cdn 技术架构图 cdn架构搭建_安全检查_59


<4>刷新bbs.westos.org/index.html,查看推送消息

cdn 技术架构图 cdn架构搭建_cdn 技术架构图_60