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,知道了这个请求想要什么,就到缓存中查找是否有这个对象。如果有,就把缓存对象直接返回给用户;如果没有,会把请求转给后端服务器处理,并等待结果。工作线程从后端得到结果内容后,先把内容作为一个缓存对象保存到缓存空间(以备下次请求这个对象时快速响应),然后再把内容返回给用户。
这里写图片描述
<3>分配缓存过程
有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去。如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块。如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则。
<4>释放缓存过程
有一个线程来负责缓存的释放工作,它定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间。释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合为一个更大的空闲块,实现空间碎片的整理。
cdn实现varinsh缓存
实验环境:
server1:varnish机(ip:172.25.51.1)
server2:read server机(ip:172.25.51.2)
server3:read server机(ip:172.25.51.3)
server1
下载安装varish软件
[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 varnish-libs-3.0.5-1.el6.x86_64.rpm -y
[root@server1: ~]# yum install varnish-3.0.5-1.el6.x86_64.rpm -y
修改varnish配置文件
[root@server1: ~]# vim /etc/sysconfig/varnish
62 # # Default address and port to bind to
63 # # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
64 # # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
65 # VARNISH_LISTEN_ADDRESS=
66 VARNISH_LISTEN_PORT=80 ##修改varnish端口
67 #
68 # # Telnet admin interface listen address and port
69 VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
70 VARNISH_ADMIN_LISTEN_PORT=6082
[root@server1: ~]# vim /etc/varnish/default.vcl
6 #
7 backend default {
8 .host = "172.25.51.2";
9 .port = "80";
10 }
11 #
[root@server1: ~]# vim /etc/security/limits.conf ##修改内核显示
50 # End of file
51 varnish - nofile 131073
52 varnish - memlock 102400
53 varnish - nproc unlimited
varnish主机配置
backend web1 { ##访问web1时,指向172.25.51.2
.host = "172.25.51.2";
.port = "80";
}
backend web2 { ##访问web2时,指向172.25.51.3
.host = "172.25.51.3";
.port = "80";
}
sub vcl_recv { ##www.westos.org和westos.org
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";
}
}
sub vcl_deliver { ##第一次访问时MISS,后续访问HIT,varnish默认清楚时间120s
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@oundation51 ~]# curl www.westos.org
<h1>server2</h1>
[root@oundation51 ~]# curl bbs.westos.org
<h1>server3</h1>
varnish负载均衡设置
server1:
修改配置文件
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;
return (pass);
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
server3开启httpd设置
[root@server3: ~]# vim /etc/httpd/conf/httpd.conf
Name VirtualHost *:80
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName www.westos.org
</VirtualHOst>
<VirtualHost *:80>
DocumentRoot /www/html
ServerName bbs.westos.org
</VirtualHOst>
[root@server3: ~]# /etc/init.d/httpd restart
测试:
[root@oundation51 ~]# curl www.westos.org
<h1>server2</h1>
[root@oundation51 ~]# curl www.westos.org
<h1>server3</h1>
[root@oundation51 ~]# curl www.westos.org
<h1>server2</h1>
[root@oundation51 ~]# curl www.westos.org
<h1>server3</h1>
[root@oundation51 ~]# curl www.westos.org
<h1>server2</h1>
[root@oundation51 ~]# curl www.westos.org
<h1>server3</h1>
varnish推送管理
目的:当web有更新时,varish的cache实现同步更新
安装httpd,php,unzip
[root@server1: ~]# yum install httpd php inzip -y
修改httpd端口8080
默认发布目录/var/www/html下解压 bansys.zip
修改varnish配置文件 /etc/varnish/default.vcl