CDN-内容分发网络

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sr_1114/article/details/80187430

cdn内容分发网络

      cdn安装配置 cdn域名访问控制 cdn负载均衡配置CDN的全称是Content Delivery Network,即内容分发网络。Cdn是一种新型的网络构建方式。它包括分布式存储,负载均衡,网络请求的重定向和内容管理4个要件,而内容管理和全局的网络流量管理是从东南的核心所在。通过用户的就近性和服务器负载的判断,cdn确保内容以一种极为高效的方式为用户的请求提供服务。总的来说内容服务基于缓存服务器,也称为代理缓存,它位于网络的边缘,距用户只有一跳之隔。即可以减轻后端服务器的压力,也能让加速用户的请求。

    简单点来说,就是给网络的边缘增加一层缓存机制,当用户访问时,如果自身含有访问的数据,就反馈给用户。若自身不存有该数据,将请求导向距离用户最近的服务节点,因此,可以加速用户的请求,使用户获得更好的体验感。也可以避开互联网上的瓶颈。以下是使用varnish简单实现cdn的过程。

操作系统版本:redhat6.5

Cdn代理服务器:server1 172.25.60.1

后端服务器:server2 172.25.60.2   Server3 172.25.60.3

客户端: foundation60.example.com 172.25.60.250

Varnish安装及其相关配置

1.varnish安装,可以在网络上下载相应的安装包,我使用的是以下版本,其中varnish-libs-3.0.5-1.el6.x86_64.rpm是其依赖性。

[root@server1 ~]# ls
varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
[root@server1 ~]# yum install * -y

2.Cdn服务配置/etc/varnish/是varnish的主配置文件,/etc/sysconfig/varnish是varnish的全局性配置文件,在安装上varnish之后,会自动生成一个varnish用户,在运行时都是以该用户进行运行。

[root@server1 ~]# cd /etc/varnish/
[root@server1 varnish]# ls
default.vcl 主配置文件 secret 密钥
[root@server1 varnish]# id varnish varnish
uid=498(varnish) gid=499(varnish) groups=499(varnish)
#让varnish监听的端口为80端口
[root@server1 varnish]# vim /etc/sysconfig/varnish 
VARNISH_LISTEN_PORT=80

#定义后端服务器为172.25.60.2
[root@server1 varnish]# vim default.vcl 
backend default {
  .host = "172.25.60.2";
  .port = "80";
}

启动varnish后可以检测到varnish监听的端口为80
[root@server1 varnish]# /etc/init.d/varnish start
[root@server1 varnish]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LIST

3.后端服务器配置

#给服务器apache发布目录中写入测试页面,其使用的端口为80
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# /etc/init.d/httpd start
[root@server2 ~]# echo server2 > /var/www/html/index.html

4.测试

    可以用浏览器访问172.25.60.1,也可以使用以下方式测试。当用户访问172.25.60.1的时候,cdn服务器去后端服务器提取数据,所以访问172.25.60.1的发布页面时,显示的是172.25.60.2发布页面的内容。

[root@foundation60 cdn]# curl 172.25.60.1
Server2

    其实,当用户第一次访问时,cdn并没有所访问的数据,所以它会去后端的服务器去取。Cdn将数据取回来之后做了两件事。第一件事就是将数据反馈给客户端,第二件事就是将数据保存给自己一份,当再有客户端过来访问该数据时,可以直接将数据返回给客户端,不需要再去后端的服务器取数据,这样客户端就可以更快速的得到数据。要验证这种机制,其实非常简单,只需要给varnish的主配置文件中写入发布测试代码就可以检测,你可以参照我所写的内容进行测试。

#以下内容的意思是当去客户端提取数据时,显示MISS from westos cache。若不是显示HIT from westos cache
[root@server1 ~]# cd /etc/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 reload

#客户端进行测试,请注意最后一行
[root@foundation60 ~]# curl -I 172.25.60.1:/index.html
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 21 Apr 2018 06:34:35 GMT
ETag: "5fcc4-f-56a55ff8b6860"
Content-Type: text/html; charset=UTF-8
Content-Length: 15
Accept-Ranges: bytes
Date: Sat, 21 Apr 2018 07:23:45 GMT
X-Varnish: 1280139965
Age: 0
#再次访问
[root@foundation40 cdn]# curl -I 172.25.60.1:/index.html
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 21 Apr 2018 06:34:35 GMT
ETag: "5fcc4-f-56a55ff8b6860"
Content-Type: text/html; charset=UTF-8
Content-Length: 15
Accept-Ranges: bytes
Date: Sat, 21 Apr 2018 07:23:47 GMT
X-Varnish: 1280139966 1280139965
Age: 3
Via: 1.1 varnish
Connection: keep-alive
X-Cache:  HIT from westos cache

    清除缓存后可以继续,但值的注意的是,访问172.25.60.1和172。25.60.1/index.html是不同的,在访问或者清楚缓存也是不同的。

#清除所有缓存
[root@server1 varnish]# varnishadm ban.url $.*
#清除index.html文件的缓存
[root@server1 varnish]# varnishadm ban.url /index.html

    除了缓存机制外,cdn还可以对域名进行访问控制,简单来说就是通过访问不同的域名实现对后端服务器调度的控制。    

1.服务器端配置

#全部安装上httpd
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# /etc/init.d/httpd start
[root@server2 ~]# echo server2 > /var/www/html/index.html
[root@server3 ~]# yum install httpd -y
[root@server3 ~]# /etc/init.d/httpd start
[root@server3 ~]# echo server3 > /var/www/html/index.html

2.Cdn服务器配置

#当访问	www.westos.com或者wetstos.com时,所访问的域名都是www.westos.com,调取的数据都是web1上的数据,即172.25.60.2:80上的数据,当访问的域名是bbs.westos.com时,调取wb2即172.25.60.3:80上的数据。
[root@server1 ~]# vim /etc/varnish/default.vcl 
backend web1 {
  .host = "172.25.60.2";
  .port = "80";
}
backend web2 {
  .host = "172.25.60.3";
  .port = "80";
}
sub vcl_recv {
  if (req.http.host ~ "^(www.)?westos.com") {
  set req.http.host = "www.westos.com";
  set req.backend = web1;
  } 
  elsif (req.http.host ~ "^bbs.westos.com") {
  set req.backend = web2;
  } 
  else {
  error 404 "westos cache";
  }
}
[root@server1 ~]# /etc/init.d/varnish reload

3.客户端解析配置及测试

#域名解析
[root@foundation60 ~]# vim /etc/hosts
172.25.60.1 server1    bbs.westos.com westos.com www.westos.com  westos.com
#测试
[root@foundation60 ~]# curl westos.com
Server2
[root@foundation60 ~]# curl www.westos.com
Server2
[root@foundation60 ~]# curl bbs.westos.com
Server3

    负载均衡作为cdn的4大要件之一,是一定要体会的。但是由于条件的限制,我使用了return(pass)参数,让cdn直接去后端服务器去调取数据,如果不加该参数,因为cdn的缓存机制很难看到负载均衡效果。

1.cdn服务器配置

#修改配置文件,使其访问www.westos.com时进行负载均衡。将web1和wb2加入到lb这个组中,round-robin是轮叫算法。
[root@server1 ~]# cd /etc/varnish/
[root@server1 varnish]# vim default.vcl 
backend web1 {
  .host = "172.25.60.2";
  .port = "80";
}
backend web2 {
  .host = "172.25.60.3";
  .port = "80";
}

director lb round-robin{
  { .backend = web1; }
  { .backend = web2; }
}
sub vcl_recv {
  if (req.http.host ~ "^(www.)?westos.com") {
  set req.http.host = "www.westos.com";
  set req.backend = lb;
  return (pass);
  }
   elsif (req.http.host ~ "^bbs.westos.com") {
  set req.backend = web2;
  }
   else {		
  error 404 "westos cache";
  }
}
[root@server1 varnish]# /etc/init.d/varnish reload

2.服务器端配置

#因为server3上没有www.westos.com的apache虚拟主机,所以给server3上创建一个www.westos.com的apache虚拟主机
[root@server3 ~]# vim /etc/httpd/conf/httpd.conf 
NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName bbs.westos.com
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /www
    ServerName www.westos.com
</VirtualHost>
[root@server3 ~]# mkdir /www
[root@server3 ~]# echo www.server3 > /www/index.html
[root@server3 ~]# /etc/init.d/httpd restart

3.客户端进行测试

[root@foundation60 kiosk]# curl www.westos.com
www.server3
[root@foundation60 kiosk]# curl www.westos.com
Server2
[root@foundation60 kiosk]# curl www.westos.com
www.server3
[root@foundation60 kiosk]# curl www.westos.com
Server2
#因为varnish自带健康检查,测试如下
[root@server2 ~]# /etc/init.d/httpd stop
[root@foundation60 kiosk]# curl www.westos.com
www.server3
[root@foundation60 kiosk]# curl www.westos.com
www.server3

    因为cdn的缓存,所以当后端服务器的数据变动时,cdn不能及时的跟进,所以这就需要数据的推送,具体的推送方式后期介绍。

猜你喜欢

转载自blog.csdn.net/sr_1114/article/details/80187430