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
DocumentRoot /var/www/html
ServerName bbs.westos.com
DocumentRoot /www
ServerName www.westos.com
[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