CDN介绍:
1 . 对cdn的理解: CDN的全称是(Content Delivery Network),即内容分发网络;加速器,反向代理缓存。CDN系统能够实时的根据网络流量和各节点的连接,负载状况以及到用户的举例和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上,其目的是使用户可以就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。
2. 基本原理: CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
3 . 服务模式: 简单地说,内容分发网络(CDN)是一个经策略性部署的整体系统,包括分布式存储、负载均衡、网络请求的重定向和内容管理 4个要件,
内容管理和全局的网络流量管理(Traffic Management)是CDN的核心所在。通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务 。
内容服务基于缓存服务器,也称作代理缓存(Surrogate) ,它位于网络的边缘,距用户仅有"一跳"(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得CDN服务提供商能够代表他们客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。
varnish介绍:
1 . varnish: 是一款具有高性能的开源http加速器,具有反向代理、缓存功能。
Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存。Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,所以Varnish要相对更高效,但也有缺点,内存中的缓存在服务器重启后会丢失。
2 . varnish 如何工作: varnish主要存在两个进程,manage进程及child进程,
manage 进程:更新配置,vcl 文件编译,varnish 监控,初始化 varnish 及提供 varnish 管理接口。
child 进程:主要进行请求任务的处理,接受请求等。
child 进程中各线程的处理任务:
accept 线程: 监听端口,接受连接;接受连接后组成 session 结构,查看是否有空闲线程,若有则分配给其处理,若无,则检查等待队列 overflow 的大小,若过大,则抛弃请求,否则加入 overflow 队列。
work 线程: 从 overflow 队列中获取任务, 走 Varnish 状态机流程处理任务,完成后通过 pipe 的线程通信,传递给 epoll 线程,等待下一个事件触发。
epoll 线程:将事件发送时对应的 session , 放入 overflow 队列,以供 work 线程从中取出继续处理。当然,在等待事件发送时,会检查该 session 是否过期。
expire 线程:对以二叉树形式组织的缓存对象,进行过期检查,对过期的对象进行处理(更新或者弃用。
cdn加速的实现:
实验环境:
三台主机:为了实验方便,全部关闭防火墙,selinux设置为disabled
代理服务器(varnish服务器):172.25.5.111
后端资源服务器:172.25.5.112
客户端物理主机:172.25.5.250
1 . 代理服务端安装:
varnish-4.0.5-1.el7.x86_64.rpm
varnish-libs-4.0.5-1.el7.x86_64.rpm
jemalloc-3.6.0-1.el7.x86_64.rpm
rpm -qc 软件包 查看生成的文件
2)查看varnish的服务文件:
vim /usr/lib/systemd/system/varnish.service
Varnish打开的最大文件数限制为131072
Varnish锁定的共享内存大小为82M
3)查看本机系统最大文件访问数量
sysctl -a | grep file
发现满足Varnish打开的最大文件数限制
4)全局临时更改共享内存及最大文件数
ulimit -n 131072 ##临时更改更改最大文件数ulimit -l 82 ##临时更改更改最大共享内存ulimit -a ##查看用户限制
5)编辑varnish用户的限制文件
vim /etc/security/limits.conf ##将最大文件访问数以及锁定的内存大小写入文件最后
6)修改varnish服务端口
vim /etc/varnish/varnish.params 更改端口为80
7)varnish主配置文件中指定后端服务器
vim /etc/varnish/default.vcl 指定后端服务和端口
最后重启vanish服务
2 . 设置后端服务器
yum install httpd -ycd /var/www/html/vim index.htmlsystemctl start httpd
3 . 测试:使用物理主机直接访问代理服务器,可以得到资源服务器中的内容
Varnish缓存命中情况:
作为varnish代理端,在配置文件中添加了后端服务器的ip及端口,在访问代理端的时候实际是在访问后端服务器,则第一次访问会产生缓存,下一次访问的时侯则由缓存服务器直接响应客户端需求,减少延时。
修改配置文件,在缓存数据时发送信息给客户端(查看缓存命中情况),根据数据是来自后端服务器还是来自缓存的内容,返回不同的消息给客户端主机。
vim /etc/varnish/default.vcl
在缓存数据将要发送到客户端时调用的子进程。
在代理服务器上对varnish缓存进行清理:
varnishadm ban req.url "~" / # 清理所有的缓存varnishadm ban req.url "~" /index.html # 对指定文件的缓存进行清理
先对varnish服务器的缓存进行清理:
varnishadm ban req.url "~" /
使用客户主机进行测试缓存命中情况:
第一次访问的时候不存在缓存内容,数据由后端服务器获取
再次访问的时候已经有了缓存数据,命中缓存。
定义不同域名站点的后端服务器:
在使用不同的域名访问同一台代理服务器的时候,可以进行设置,将请求由发送到不同的后端服务器。
需要在代理服务器的varnish配置文件中设置多个后端服务器,并在vcl_recv 子程序中设置对不同的域名请求发送到不同的后端服务器。
vim /etc/varnish/default.vcl 在varnish端添加
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") { ##如果请求的域名为www.westos.org或者 westos.orgset req.http.host = "www.westos.org"; ##当将其赋值为 www.westos.orgset req.backend_hint = web1; ##让后将请求发送给为web1 后端服务器
}elsif (req.http.host ~ "^bbs.westos.org") { ##如果请求域名为bbs.westos.orgset req.backend_hint = web2; ##就将请求发送给web2
}else {return (synth(405)); ##其他的域名返回一个405错误
}
}
写好之后重启varnish服务
在客户端写好解析:
解析好之后进行测试:
轮询机制实现后端服务器负载均衡:
当某台后端服务器的访问压力过大的时候,可以设置多台后端服务器,提供相同的内容服务,将客户请求分配给多台服务器,减缓一台服务器的压力。
可以把多台 backends 聚合成一个组,这些组被叫做 directors。这样可以增强性能和弹力.
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so"; ##导入模块
backend web1 {.host = "172.25.5.112"; 定义第一个后端服务器.port = "80";
}
backend web2 {.host = "172.25.5.113"; 定义第二个后端服务器.port = "80";
}sub vcl_init {new lb = directors.round_robin(); 新建一个组lb.add_backend(web1); 将web1 添加到这个组lb.add_backend(web2); 将web2 添加到这个组
}sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {set req.http.host = "www.westos.org";set req.backend_hint = lb.backend(); 发送请求循环组,让组中的后端服务器轮流处理请求return(pass); 设置直接将请求发送到后端服务器,并且不缓存返回的内容
}elsif (req.http.host ~ "^bbs.westos.org") {set req.backend_hint = web2;
}else {return (synth(405));
}
}
round_robin()这个 director 是一个循环的 director。它的含义就是 director 使用循环的方式把backends 分给请求。
测试:
推送管理平台:
为了更加快捷方便及时对代理服务器中缓存内容进行清理更新。可以在代理服务器上设置网络推送页面,直接在网页上推送平台对代理服务器缓存进行修改。
1 代理服务器上安装php 以及http
由于推送平台使用的是php进行编写,需要安装php插件识别php脚本内容。
yum install php httpd -y
vim /etc/httpd/conf/httpd.conf 更改http端口为8080,80默认端口已经被varnish占用
systemctl restart httpd 重启http服务
2 解压平台安装包到httpd公共目录里
unzip bansys.zip -d /var/www/html (没有unzip的可以先yum install unzip)
cd /var/www/html
mv bansys/* /var/www/html # 将解压出目录中的文件全部放到公共目录中
vim config.php 修改推送平台配置文件如下
3 . 修改varnish配置文件
vim /etc/varnish/default.vcl
重启varnish服务
4 . 客户端进行测试 :http://172.25.5.111:8080