前提 本次实验应该用到5台Server和至少两台测试Client。 但受制于服务器数量影响,实际一共用到了3台服务器,其中权威DNS本次没有配置。智能DNS跟CDN缓存节点1共用同一台服务器。
本次实验不介绍源站Server的搭建。本实验环境中用的是现成的系统。 本次实验默认读者已经了解 DNS的相关知识,如A记录、CNAME记录、NS记录等。 本次实验默认读者已经了解CDN的基本原理。 本次实验默认读者了解Linux基本的知识点。 如果不具备以上知识点,请先补充完善自己的知识体系。
实验规划: 1、 客户源站域名为test.wangrx.com,正常配置在权威DNS上作解析,解析地址为10.163.250.53 2、 CDN系统域名为 x.cdn.com,CDN系统智能DNS服务器为10.200.17.7。其中CDN系统域名(x.cdn.com)在权威DNS上有一条NS记录,NS记录指向10.200.17.7。 3、 以下步骤为客户开始使用CDN服务。 4、 第一步,客户需要在权威DNS上把域名的A记录修改为CDN服务商给的CNAME记录。比如本次实验CDN服务商给客户提供的CNAME记录为 test.wangrx.cdn.com。即test.wangrx.com-----CNAME----test.wangrx.cdn.com 5、 第二步,CDN服务商在智能DNS系统上配置相应的解析记录。 6、 第三步,CDN服务商在CDN缓存节点配置相应的反向代理。 7、 第四步,用客户端测试。 (PS:我们做实验,其实我们自己就是CDN服务提供商。)
- 第一步部分 搭建智能DNS系统 实验步骤 1、 准备一台CentOS 7服务器作为智能DNS服务器 2、 用bind搭建DNS服务器 3、 配置test.wangrx.cdn.com域名解析A记录。其中QD地区IP过来的DNS解析请求解析到CDN缓存节点1,HD地址IP过来的DNS解析请求解析到CDN缓存节点2。 4、 用client进行解析测试
实验 1、 我的环境CentOS7已经创建完成 2、 安装DNS服务 # yum -y install bind 3、 修改全局配置文件/etc/named.conf
先备份配置文件 \# cp /etc/named.conf /etc/named.conf.bak 修改配置文件 # vi /etc/named.conf
acl qd {
10.190.0.0/16; /\*模拟QD地区IP地址\*/
};
acl hd {
10.200.0.0/16; /\*模拟HD地址IP地址\*/
};
acl others {``
0.0.0.0/0; /\*其他IP地址\*/
};
options {
// listen-on port 53 { any; }; /\*这行注释掉,不注释的话括号里修改成any也可\*/
// listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; }; /\*这行不要注释,括号里修改成any\*/
recursion yes;
// dnssec-enable yes; /\*注释掉即可\*/
// dnssec-validation yes; /\*注释掉即可\*/
/\* Path to ISC DLV key \*/
// bindkeys-file "/etc/named.root.key"; /\*注释掉即可\*/
// managed-keys-directory "/var/named/dynamic"; /\*注释掉即可\*/
// pid-file "/run/named/named.pid"; /\*注释掉即可\*/
// session-keyfile "/run/named/session.key"; /\*注释掉即可\*/
forwarders { 10.138.92.76;10.138.92.77;}; /\*根据实际情况配置上级转发DNS服务器,如果单纯本机局域网内解析,可以不配置转发\*/
forward first ; /\*这条可不配,具体含义百度吧\*/
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
//zone "." IN { /\*配置view之后,所有解析zong都转到具体解析文件内,所以此处的zone需要注释掉\*/
// type hint;
// file "named.ca";
//};
//include "/etc/named.rfc1912.zones"; /\*注释掉\*/
//include "/etc/named.root.key"; /\*注释掉\*/
view view_qd { /\*添加配置,QD地区IP地址匹配到/etc/named.rfc1912.zones.qd文件中\*/
match-clients {qd;};
include "/etc/named.rfc1912.zones.qd";
};
view view_hd { /\*添加配置,HD地区IP地址匹配到/etc/named.rfc1912.zones.hd文件中\*/
match-clients {hd;};
include "/etc/named.rfc1912.zones.hd";
};
view view_others { /\*添加配置,others地区IP地址匹配到/etc/named.rfc1912.zones.others文件中\*/
match-clients {others;};
include "/etc/named.rfc1912.zones.others";
};
:wq 保存退出
4、 创建QD、HD、others地区的配置文件 创建QD区域配置文件 # cp /etc/named.rfc1912.zones /etc/named.rfc1912.zones.qd # chown :named /etc/named.rfc1912.zones.qd # vi /etc/named.rfc1912.zones.qd
/*添加以下解析记录*/
zone "." IN {
type hint;
file "named.ca";
};
zone "cdn.com" {
type master;
file "cdn.com.zone.qd";
};
:wq /*保存退出*/
创建HD区域配置文件 # cp /etc/named.rfc1912.zones /etc/named.rfc1912.zones.hd # chown :named /etc/named.rfc1912.zones.hd # vi /etc/named.rfc1912.zones.hd
/*添加以下解析记录*/
zone "." IN {
type hint;
file "named.ca";
};
zone "cdn.com" {
type master;
file "cdn.com.zone.hd";
};
:wq /*保存退出*/
创建others区域配置文件 # cp /etc/named.rfc1912.zones /etc/named.rfc1912.zones.others # chown :named /etc/named.rfc1912.zones.others # vi /etc/named.rfc1912.zones.others
/*添加以下解析记录*/
zone "." IN {
type hint;
file "named.ca";
};
zone "cdn.com" {
type master;
file "cdn.com.zone.others";
};
:wq /*保存退出*/
5、 修改qd地区解析数据库 # cp /var/named/named.localhost /var/named/cdn.com.zone.qd # chown :named /var/named/cdn.com.zone.qd # chmod 640 /var/named/cdn.com.zone.qd # vi /var/named/cdn.com.zone.qd
$TTL 1D
@ IN SOA @ cdn.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
dns IN A 10.200.17.7
test.wangrx IN A 10.200.17.7 /*配置QD地区客户解析的A记录*/
:wq /*保存退出*/
6、 修改HD地区解析数据库 # cp /var/named/named.localhost /var/named/cdn.com.zone.hd # chown :named /var/named/cdn.com.zone.hd # chmod 640 /var/named/cdn.com.zone.hd # vi /var/named/cdn.com.zone.hd
$TTL 1D
@ IN SOA @ cdn.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
dns IN A 10.200.17.7
test.wangrx IN A 10.163.250.54 /*配置HD地区客户解析的A记录*/
:wq /*保存退出*/
7、 修改others地区解析数据库 # cp /var/named/named.localhost /var/named/cdn.com.zone.others # chown :named /var/named/cdn.com.zone.others # chmod 640 /var/named/cdn.com.zone.others
$TTL 1D
@ IN SOA @ cdn.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
dns IN A 10.200.17.7
test.wangrx IN A 10.200.17.7 /*跟qd地区配置一样*/
8、 到此,简易版的智能DNS系统就配置完成了。实现功能如下: >当智能DNS收到属于10.190.0.0/16网段的QD地址的DNS查询请求时,返回/var/named/cdn.com.zone.qd数据库文件里的解析记录,即test.wangrx.cdn.com的A记录IP 10.200.17.7 >当智能DNS收到属于10.200.0.0/16网段的HD地址的DNS查询请求时,返回/var/named/cdn.com.zone.hd数据库文件里的解析记录,即test.wangrx.cdn.com的A记录IP 10.163.250.54
9、 启动DNS服务 # systemctl start named 10、测试
Client把DNS服务器配置为10.200.17.7,即智能DNS服务器地址,然后对test.wangrx.cdn.com作解析,结果如下: Client1: 属于10.190.0.0/16的QD地区的地址,解析到的IP为10.200.17.7
Client2: 属于10.200.0.0/16的HD地区的地址,解析到的IP为10.200.250.54
第二部分 利用squid搭建缓存服务器 实验步骤
1、 部署两台CentOS服务器作为CDN缓存节点,IP地址分别是10.200.17.7和10.163.250.54 2、 在两台缓存节点上搭建squid 3、 配置反向代理作为缓存服务器 实验
一、 squid介绍 Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。 代理分为 正向代理,透明代理,反向代理 1) 正向代理:为局域网中的机器 访问目标地址(比如www.baidu.com) 不可达时 可以通过一个中间代理服务器(可以访问www.baidu.com)进行转发 。正向代理 一般用于局域网联网等用途 并且局域网pc机器 需要在客户端进行一些设置 比如浏览器设置局域网代理设置 2) 反向代理:互联网中的机器访问局域网中代理服务器,代理服务器通过各种规则找到对应后台服务器,获取数据响应。反向代理中,访问机器明确访问的资源就是位于代理服务器,不需要在机器进行任何设置。可以用于设计cdn服务器,代理后端的静态资源 二、 squid安装 这里使用yum安装,安装环境 centos7。默认squid安装启动其实就是一个正向代理。本次实验使用反向代理,对正向代理不做介绍。 1、 yum 安装过程 `yum -y install squid 2、 修改squid配置文件 vi /etc/squid/squid.conf
http_port 10080 accel vhost vport # accel表示使用加速(缓存) vhost vport表示使用虚拟ip和端口
cache_peer 10.163.250.53 parent 10080 0 #抓取的后端服务器的ip parent表示后台服务器(slibing抓取同级squid)10080后台端口 0表示是否使用icp端口
cache_peer_access web allow all
offline_mode on #表示不会后台验证资源是否有效 直接从缓存中获取
本次实验源站服务器系统是10.163.250.53:10080,所以在squid.conf配置文件中的IP和端口都是根据实际情况修改的。 3、 两台缓存服务器 10.200.17.7和10.163.250.54都配置squid反向代理。 # systemctl start squit /*启动服务*/ 因为本人对squid研究非常有限,仅限于搭建起来而已,更深层次的功能大家自己查阅资料。 *查看缓存击中率 cat /var/log/squid/access.log |grep TCPMEMHIT 相应于HTTP请求,下列标签可能出现在access.log文件的第四个空格后. TCPHIT Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端. TCPMISS Squid没有请求资源的cache拷贝. TCPREFERSHHIT Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器.原始服务器返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的. TCPREFFAILHIT Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器.然而,原始服务器响应失败,或者返回的响应Squid不能理解.在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户端. TCPREFRESHMISS Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器.原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的. TCPCLIENTREFRESHMISS Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令.Squid转发客户端的请求到原始服务器,强迫cache确认.
TCPSWAPFAILMISS Squid发现请求资源的有效拷贝,但从磁盘装载它失败.这时squid发送请求到原始服务器,就如同这是个cache丢失一样. TCPNEGATIVEHIT 在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应.在短时间内对这些资源的重复请求,导致了否命中. negativettl指令控制这些错误被cache的时间数量.请注意这些错误只在内存cache,不会写往磁盘.下列HTTP状态码可能导致否定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504. TCPMEMHIT Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端.注意这点并非精确的呈现了所有从内存服务的响应.例如,某些cache在内存里,但要求确认的响应,会以TCPREFRESHHIT, TCPREFRESHMISS等形式记录. TCPDENIED 因为httpaccess或httpreplyaccess规则,客户端的请求被拒绝了.注意被httpaccess拒绝的请求在第9域的值是NONE/-,然而被httpreplyaccess拒绝的请求,在相应地方有一个有效值. TCPOFFLINEHIT 当offlinemode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度. TCPREDIRECT 重定向程序告诉Squid产生一个HTTP重定向到新的URI(见11.1节).正常的,Squid不会记录这些重定向.假如要这样做,必须在编译squid前,手工定义LOGTCPREDIRECTS预处理指令. NONE 无分类的结果用于特定错误,例如无效主机名. 相应于ICP查询,下列标签可能出现在access.log文件的第四域. UDPHIT Squid在cache里发现请求资源的貌似新鲜的拷贝. UDPMISS Squid没有在cache里发现请求资源的貌似新鲜的拷贝.假如同一目标通过HTTP请求,就可能是个cache丢失.请对比UDPMISSNOFETCH. UDPMISSNOFETCH 跟UDPMISS类似,不同的是这里也指示了Squid不愿去处理相应的HTTP请求.假如使用了-Y命令行选项,Squid在启动并编译其内存索引时,会返回这个标签而不是UDPMISS. UDPDENIED 因为icpaccess规则,ICP查询被拒绝.假如超过95%的到某客户端的ICP响应是UDPDENIED,并且客户端数据库激活了(见附录A),Squid在1小时内,停止发送任何ICP响应到该客户端.若这点发生,你也可在cache.log里见到一个警告. UDPINVALID Squid接受到无效查询(例如截断的消息、无效协议版本、URI里的空格等).Squid发送UDPINVALID响应到客户端.*
4、 Client上测试 可以看到,用client进行测试已经可以访问成功了
至此,一个非常简易的模拟CDN系统就搭建完成了。