一、CDN的概念
CDN解析:全称Content Delivery Network,即内容分发网络!
客户需求:对网站的浏览速度和效果,用户体验好!
CDN功能:一款高性能且开源的反向代理服务器和HTTP加速器,可以有效降低web服务器的负载,提升访问速度。
理解角度:从CDN的中文表义去理解:内容、分发、网络!
(1)内容
指储存在CDN节点上的动静态资源的分发和访问的数据内容,比如JS、CSS、图片和静态页面等静态资源!
客户端:用户一般从主站获取动态内容后,再从CDN下载相应的静态数据
(2)分发
就是如何让上面提到的数据内容(资源),快速的部署在这个网络中,从而快速为用户服务。
目的:通过调度让用户访问最近的资源!
(3)网络
1)是部署于者全球(国)的一大堆服务器--->集群
2)这些服务器基于当前互联网的基础架构在其上层再构成一个网络,这个网络专为资源分发而生
二、CDN系统的理解
CDN是一个经策略性部署的整体系统,从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均而产生的用户访问网站响应速度慢的根本原因。因此CDN主要作用是通过内容和资源就近分发,保证用户快速访问,提升用户体验的一个内容网络。
CDN作为网站加速的工具,是一种组合技术,它的重要组成部分包括源站、缓存服务器、智能DNS、客户端等。
CDN网络的构成如下:
1)折叠源站
源站:指发布内容的原始站点。
操作:添加、删除、更改网站的文件,都是在源站上进行的;
明确:缓存服务器所抓取的对象也全部来自于源站
折叠:隐藏的含义,客户端并不知道折叠网站的存在,以为访问的资源站点就是源站!
2)缓存服务器
缓存服务器:是直接提供给用户访问的站点资源(直接面对用户),由一台或数台服务器组成;
用户请求资源的过程
1)当用户发起url请求时,他的访问请求被智能DNS定位到离他较近的缓存服务器;
2)如果用户所请求的内容刚好在缓存里面,则直接把内容返还给用户;
3)如果访问所需的内容没有被缓存,则缓存服务器向邻近的缓存服务器或直接向源站直接抓取内容,然后再返还给用户。
3)智能DNS
CDN整个技术核心是智能DNS,它主要根据用户的来源,将其访问请求指向离用户比较近的缓存服务器!
举例1:把深圳电信的用户请求指向到深圳电信IDC机房中的缓存服务器。
举例2:通过智能DNS解析,让用户访问同服务商下的服务器,消除国内南北网络互相访问慢的问题,达到加速作用。
4)客户端
客户端或称用户端即发起访问的普通用户,一般的访问方式是浏览器。
简单测试:curl的工具和直接在浏览器访问看实验现象!
复杂测试:可以借助Google Chrome/IE/FireFox查看HTTP请求头request header响应头,了解数据的交互过程!
#####################
三、varnish
由于目前实验的环境下没有CDN的网络环境,所以这里用相应的软件来进行模拟,目前比较流行的就是varnish!
Varnish是一款高性能的开源HTTP加速器,具有反向代理,缓存的功能!
(1)varnish的安装
#(1)软件的安装
yum install -y 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 -y
# (2)varnish核心配置文件
/etc/varnish/default.vcl #varnish核心配置文件
/etc/varnish/varnish.params #varnish的参数配置文件
# (3)varnish的服务启动文件
/usr/lib/systemd/system/varnish.service
# 此服务文件可以看服务的一些限制!
说明:Redhat镜像库中的版本太老,有漏洞,所以安装相对新的版本!
细节:varnish的内存大小和缓存的文件数目
1)由于Linux是多用户和多任务的系统,所以默认对每个用户分配的资源是固定的;
2)而varnish的运行也是以varnish的用户身份来运行,所以也会收到系统的限制。
需求:如何取消对varnish用户的限制
1)由于系统内核对用户的的限制是由于硬件的限制,所以首先改变硬件的配置,改变内存
sysctl -a |grep file #查看系统的内核允许用户的最大文件数目(文件描述符的数目)
改变:虚拟机的内存,由1G改变成2G!
# 测试:重新sysctl -a |grep file看用户可打开的文件数目的变化!
2)由于值针对varnish用户,不希望针对所有的用户,所以在配置文件中对varnish用户进行配置!
# (1)配置文件
/etc/security/limits.conf
# (2)添加的内容
varnish - nofile 131072
varnish - memlock 82000
说明:上述是永久生效!
临时生效(全局)
ullimit -l 82 #内存改变
ullimit -n 131072 #文件描述符
(2)VCL
VCL:varnish configuration language,是varnish配置语言,其用来定义varnish 的存取策略,vcl语法跟C和perl比较相似!
注意:"\"字符在VCL里没有什么特别的含义,这点和其他语言不同
备注:VCL只是配置语言(使用约定的一些东西),并不是真正的编程语言,所以没有循环和自定义变量。
/etc/varnish/default.vcl
(3)varnish状态引擎
①VCL有多个状态引擎,状态之间存在相关性,但彼此间互相隔离;
②③每个状态引擎可使用return(x)指明关联至哪个下一级引擎;
说明:每个引擎都是一个功能模块,要了解正常的处理流程!
vcl_recv:接收请求;
Lookup状态:进入此状态后,会在hash表中查找数据,若找到,则进入Hit(命中)状态,否则进入miss(未命中)状态;
pipe状态:请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个链接被关闭;
Pass状态:在此状态下,会进入后端请求,即进入Fetch状态;
Fetch状态:在Fetch状态下,对请求进行后端获取,发送请求,获得数据,是否进行本地存储;
Deliver状态:将获取到的数据发送给客户端,然后完成本次请求;
说明:必须明白原理,方便学习Nginx!
线程和进程
核心:理解请求头、请求体、和响应头和响应体,varnish构建请求头和请求头,构建响应头和响应体!
ruby语言!
四、实验
说明:讲解相关功能来理解相应的子模块!
(1)反向代理
# (1)默认的后端服务器的端口
backend default {
.host = "172.25.2.201";
.port = "80";
}
其它测试:curl ip测试
说明:此种测试会将默认页面的内容返回,不会做HTML的解析!
via响应头的字段:是http协议里面的一个header,记录了一次http请求所经过的代理和网关
说明:经过1个代理服务器,就添加一个代理服务器的信息,经过2个就添加2个
回顾:正向代理和反向代理的区别!
(2)添加响应信息
sub vcl_deliver {
if (obj.hits>0){
# 变量的设置(已经定义的变量)
set resp.http.X-Cache = "HIT from www.wzj.com 从缓存中取";
}
else{
set resp.http.X-Cache = "MISS from www.wzj.com 缓存中没有此资源";
}
# 注意:一定要return
return (deliver);
}
注意:每一行语句必须以;结尾,并且字符串必须用双引号!
测试
Age响应头信息:标识出这个请求的结果将被缓存多长时间,单位是秒!
说明:
首次请求的Age为0,说明varnish还没有没有缓存这个响应的结果
后续的重复请求将会使Age值增大,超过生命周期,缓存从内存中被自动删除!
###########
X-Cache是varnish(squid)代理的自定义header,用来记录缓存的命中与否!
规范信息的格式:HIT|MISS from 域名
###########
X-Varnish的含义
1 X-Varnish头信息--->后面会有一个或两个数字
1)如果是一个数字,就表明varnish在缓存中没有发现这个请求,这个数字的含义是varnish为这个请求所做的标记ID。
2)如果X-Varnish后是两个数字,就表明varnish在缓存中命中了这个请求,第一个数字是请求的标识ID,第二个数字是缓存的标识ID。
注意1:如果用浏览器测试,由于浏览器的本身缓存原因会影响varnish缓存,可能达不到实验现象!
注意2:浏览器中的Age表示的是浏览器缓存的有效时间,不是varnish资源缓存的有效时间!
原理:在varnish服务器响应客户端的过程中,在HTTP包文中添加相应的响应头信息,然后发送给客户端!
(3)配置多个后端服务器
backend web1 {
.host = "172.25.2.201";
.port = "80";
}
backend web2 {
.host = "172.25.2.202";
.port = "80";
}
sub vcl_recv {
# 说明:接受客户端的url请求,进行相应的处理,然后进行请求转发
# 说明:从语法的角度-->这里属于perl的正则匹配
# 体现:varnish在安装的过程中,会安装许多perl的模块!
# vcl配置语言参考了C和perl!
if (req.http.host ~"^(server1.)?wzj.com"){
# (1)修改请求主机的名字-->用户体验好
set req.http.host = "server1.wzj.com";
# (2)交给后台服务器来处理
set req.backend_hint = web1;
}elsif (req.http.host ~"^(server2.)?wzj.com") {
set req.backend_hint = web2;
}else {
# (3)都不匹配,认为请求的资源主机不存在!
# 405表示请求的方式不对,常见请求的方式有get、post、head、put!
# 404表示服务器响应了,但是服务器没有此资源,客户端的请求错误!
# 503表示服务器不存在,或者存在但没有开启服务!
return (synth(503));
}
}
DNS解析
注意:上面的server1和server2的IP是相同的(图片有错误),都是varnish服务器的IP,172.25.2.200!
说明:我将两台后端的服务器的名字wzj.com的域!
备注:一定要在/etc/resolvconf中写DNS服务器的IP!
补充:也可以本地解析文件/etc/hosts中进行自定义!
实验效果
解析:不同的域名访问相同的varish服务器,分别转发给不同的后端服务器,响应不同的内容!
注意1:两个后端服务器必须服务都开启,否则会出现503的错误!
注意2:httpd和varnish不能同时开启--->否则会出现此错误--->bind(): Address already in use
(3)负载均衡
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
# Default backend definition. Set this to point to your content server.
# (1)默认的后端服务器的端口
#backend default {
# .host = "172.25.2.201";
# .port = "80";
#}
backend web1 {
.host = "172.25.2.201";
.port = "80";
}
backend web2 {
.host = "172.25.2.202";
.port = "80";
}
sub vcl_init {
# Load Balance-->负载均衡(lb的缩写)
# 注意:directors要从库中正确导入
new lb = directors.round_robin();
# 说明:负载均衡所构成的集群,或者说lb的此套件中的负载均衡的服务器
lb.add_backend(web1);
lb.add_backend(web2);
}
sub vcl_recv {
# Happens before we check if we have this in cache already.
#
# Typically you clean up the request here, removing cookies you don't need,
# rewriting the request, etc.
# 说明:接受客户端的url请求,进行相应的处理,然后进行请求转发
# 说明:从语法的角度-->这里属于perl的正则匹配
# 体现:varnish在安装的过程中,会安装许多perl的模块!
# vcl配置语言参考了C和perl!
if (req.http.host ~"^(varnish.)?wzj.com"){
# (1)修改请求主机的名字-->用户体验好
set req.http.host = "varnish.wzj.com";
# (2)说明:此时交给构成负载集群的负载均衡的服务器
set req.backend_hint = lb.backend();
# 说明:清除缓存,实验效果更明显!
return (pass);
}elsif (req.http.host ~"^(server2.)?wzj.org") {
set req.backend_hint = web2;
}else {
# (3)都不匹配,认为请求的资源主机不存在!
# 405表示请求的方式不对,常见请求的方式有get、post、head、put!
# 404表示服务器响应了,但是服务器没有此资源,客户端的请求错误!
# 503表示服务器不存在,或者存在但没有开启服务!
return (synth(503));
}
说明:将varnish服务器也写入DNS的数据中:varnish.wzj.com
注意:测试的时候访问的一定是代理varnish服务器,是通过来访问后台资源!
负载均衡的目的:就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,减轻服务器的压力,加快响应速度
说明:负载均衡(轮询),保证后台的两个服务器资源同步,这里为了说明确是在轮询,让访问的资源不一致!
保证:即使有一台服务机宕机,也能正常提供服务!
备注:注释pass 则会从缓存中访问,而不会去向后台访问!