1、基本原理

CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

2、安装

使用rpm包进行安装
需要的软件:varnish-3.0.5-1.el6.x86_64.rpm
varnish-libs-3.0.5-1.el6.x86_64.rpm
使用时非常简单,直接进行yum install varnish--y 即可。

3、基础配置
1、配置varnish的服务端口

vim /etc/sysconfig/varnish
cdn服务器
修改原因:Varnish 是一个 web 加速器,被安装在 web 应用程序前面,缓存 web 应用程序,并响应用户请求,所以用户在进行访问时,是会直接输入网址的,比如用户在进行直接访问时,会直接输入www.laozhao.com,默认端口是80,若使用原来的端口,则访问时必须输入www.laozhao.com:端口,这样会使用户的体验值变差。

2、开启varnish服务
cdn服务器

3、配置后端服务器

varnish是一个web的加速器,所以必须开启一个有nginx或者apache服务的服务器。
开启apahce服务:
cdn服务器
vim /etc/varnish/default.vcl
cdn服务器
backend default {
.host = "172.25.99.2"; #开启apacha服务的主机ip
.port = "80";#apache的端口
}
重启varnish服务
测试:
cdn服务器
客户端访问时,提供的服务的主机确实是从varnish主机过来的。

4、查看缓存命中情况

若用户在短时间内进行访问同一个页面,则提供给用户的主机不是提供apache服务的主机,而是提供varnish缓存的主机,此为查看缓存命中情况。
vim /etc/varnish/default.vcl
cdn服务器
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from zhao cache";#命中缓存,从缓存中取出
}
else {
set resp.http.X-Cache = "MISS from zhao cache";#没有命中缓存,从后端服务器取出
}
return (deliver);
}
测试:
短时间内进行两次访问,
cdn服务器
cdn服务器
至于varnish的这个缓存是多久进行一次清理,在/etc/sysconfig/varnish
cdn服务器
此文件可以对缓存存储的时间进行修改,此默认值是为2分钟。
也可以进行手动清除缓存
*# varnishadm ban.url .$
#清除所有
# varnishadm ban.url /index.html*
#清除 index.html 页面缓存
# varnishadm ban.url /admin/$*
#清除 admin 目录缓存

5、后端有多个服务器

vim /etc/varnish/default.vcl
cdn服务器
backend web1 {
.host = "172.25.99.2";
.port = "80";
}
backend web2 {
.host = "172.25.99.3";
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?laozhao.com") {#若搜索的www.laozhao.com或者laozhao.com,则在web2中找
set req.http.host = "www.laozhao.com";
set req.backend = web2;
} elsif (req.http.host ~ "^bbs.laozhao.com") {#若搜索的为bbs.laozhao.com,则在web1中找
set req.backend = web1;
} else {error 404 "zhao cache";
}
}
重启varnish服务
测试:
cdn服务器

6、对后端提供服务的服务器进行一个负载均衡

在实际生活中,提供同一个服务的服务器一定不会仅是一个主机的,在客流量很大的情况下,一定会在varnish这的后端服务器进行一个负载均衡,以减少后端服务器的压力。
我在提供apache服务的主机上设置了两个虚拟主机。
server2与server3均有提供www.laozhao.com服务。对此进行一个负载均衡
vim /etc/varnish/default.vcl
cdn服务器
backend web1 {
.host = "172.25.99.2";
.port = "80";
}
backend web2 {
.host = "172.25.99.3";
.port = "80";
}
director lb round-robin { #定义一个对web1与web2进行轮循lb
{.backend = web1;}
{.backend = web2;}
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?laozhao.com") {
set req.http.host = "www.laozhao.com";
set req.backend = lb; ##在访问www.laozhao.com时,分别从web1,web2进行掉去数据。
return(pass); ##在实际生活中,是不会进行这样的定义的,因为有ttl时间,在缓存中有响应的数据,为了方便测试,则使用到了这条语句。
} elsif (req.http.host ~ "^bbs.laozhao.com") {
set req.backend = web1;
} else {error 404 "zhao cache";
}
}
测试:
分别从web1与web2进行调取数据。
cdn服务器

7、缓存推送系统

此缓存推送系统所是一个由php语言编写的程序,需要在主机上安装php。
在浏览器上进行推送的,所以需要安装httpd服务,必须将httpd服务的端口改为别的,不能与varnish冲突,我将端口修改为了8080
需要的软件:bansys.zip
将解压后的所有文件放置在httpd的默认发布目录中
修改config.php文件
cdn服务器
在浏览器进行访问,在后面加上:8080
cdn服务器

将测试负载均衡的return(pass)删除,否则测试结果会有问题
测试:
此时修改server2的默认发布目录,在此推送系统上输入/index.html,在缓存还没有清除的时间内,查看用户访问的页面是否已经进行了修改