CDN 基础知识
CDN (Content Delivery Network)主要是实现负载均衡和代理缓存,减少服务器压力。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
优点:CDN能几乎涵盖国内所有线路。而在可靠性上, CDN 在结构上实现了多点的冗余,即使某一个节点由于意外发生故障,对网站的访问能够被自动导向其他的健康节点进行响应。CDN能轻松实现网站的全国铺设,不必考虑服务器的投入与托管、不必考虑新增带宽的成本、不必考虑多台服务器的镜像同步、不必考虑更多的管理维护技术人员。
之前cdn方面接触过squid,但是与varnish相比,其还有很多缺点,现基本不再应用squid,所以我们本次实验用的是varnish
Varnish与Squid的对比 Squid是一个高性能的代理缓存服务器,它和varnish之间有诸多的异同点。
- 相同点: 1. 都是一个反向代理服务器。 2. 都是开源软件。
- 不同点:
Varnish的优点: - Varnish的稳定性很高,两者在完成相同负荷的工作时,Squid服务器发生故障的几率要高于Varnish,因为使用Squid要经常重启。
- Varnish访问速度更快,所有缓存数据都直接从内存读取,而squid是从硬盘读取
- Varnish可以支持更多的并发连接,因为Varnish的TCP连接释放要比Squid快。因而在高并发连接情况下可以支持更多TCP连接。
- Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的。
Vaenish 工作原理
Varnish 是一款高性能的开源HTTP加速器,具有反响代理,高速缓存的功能
VCL(Vanish Configuration Language) 处理流程图
处理过程大致分为如下几个步骤:
- Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。 - Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。 - Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
- Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。 - Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
实验环境
主机名 | IP |
---|---|
server1 | 172.25.60.1 |
server2 | 172.25.60.2 |
server3 | 172.25.60.3 |
1、单个后端服务器
- server1
- 安装Varnish,并开启:
yum install varnish-libs-3.0.5-1.el6.x86_64.rpm
yum install varnish-3.0.5-1.el6.x86_64.rpm
/etc/init.d/varnish start
- 查看已安装的varnish的配置文件 :
rpm -qc varnish-3.0.5-1.el6.x86_64
- varnish配置文件信息:
vim /etc/sysconfig/varnish
NFILES=131072 # 最多能打开的文件数,varnish会自动调整该值
MEMLOCK=82000 # 最多能使用的内存空间,varnish会自动调整该值
NPROCS="unlimited" # 单个用户所能运行的最大线程数
VARNISH_LISTEN_PORT=80 #修稿端口
- 查看能打开文件的系统参数:
sysctl -a | grep file
- 查看系统能运行的线程数:
ulimit -l
因为varnish这个程序运行在varnish这个用户的私有空间内,内核对普通用户限制的最大文件数为1024.对varnish用户限制的最大文件数为131072,我们需要满足131072这个最大值。 - 更改系统内存大小:
- 修改varnish用户的限制文件:
vim /etc/security/limits.conf
在最后加入:
vanish - nofile 131072
vanish - memlock 82000
vanish - nproc unlimited
- 配置文件一个后端服务器和查看缓存命中情况 :
vim /etc/sysconfig/varnish/default.vcl
- 在varnish中命中HIT访问的域名
- 后端服务器中得到MISS访问的域名
- 开启服务,编写配置文件后要重新加载默认文件:/etc/init.d/varnish reload
[root@server1 ~]# /etc/init.d/varnish start
Starting Varnish Cache: [ OK ]
[root@server1 ~]# /etc/init.d/varnish reload
ps ax | grep varnish
cat /proc/1060/status
- server2
- 安装apache
- 编写前端文件:
vim /var/www/html/index.html
hello,i am server_2
- 开启httpd服务:
/etc/init.d/httpd start
- 测试:在物理机上测试:
curl -I 172.25.60.1
和curl -I 172.25.60.1/index.html
- 第一次显示MISS:
MISS from westos cache
- 第二次显示HIT:
HIT from westos cache
在服务端清除缓存
varnishadm ban.url .*$
varnishadm ban.url /index.html
- 又变为MISS
2、多个后端服务器
- server2的配置同上
- server3配置:
- - 安装apache
- 编写前端文件:
vim /var/www/html/index.html
hello,i am server_3
- 开启httpd服务:
/etc/init.d/httpd start
- server1
- 开启varnish:
/etc/init.d/varnish start
- 配置varnish的default文件
backend web1 { ##后端第一个服务器名web1
.host = "172.25.60.2"; ##将server2 作为第一个服务器主机
.port = "80";
}
backend web2{ ##后端第二个服务器名web2
.host = "172.25.60.3"; ##将server3 作为第二个服务器主机
.port = "80";
}
sub vcl_recv {
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 {
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);
}
- 编辑完配置文件后,要重新加载配置文件
/etc/init.d/varnish reload
- 测试
- 在测试端添加解析文件
vim /etc/hosts
172.25.60.1 server1 www.westos.org bbs.westos.org
172.25.60.3 server3
- 物理机中访问测试
3、Varnishi 实现负载均衡
负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。负载均衡算法的种类有很多种,常见的负载均衡算法包括轮循法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法等,应根据具体的使用场景选取对应的算法。
- 在server1 的 Varnish采用轮循法,平衡对待每一个后端服务器。
- 配置varnish的default文件
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.org") {
set req.http.host = "www.westos.org";
set req.backend = lb; ###调用lb轮循函数
return(pass); ##不进行缓存
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
- 编辑完配置文件后要重新加载
- 测试端
4、一台主机多个解析的情况
- server3
- 在server3的httpd默认发布目录中设置两个发布目录,并把80端口注释的打开
- 在设置的两个发布目录下,编辑两个测试页面
- 重启httpd服务
- 测试端