一、什么是CDN?
CDN(Content Delivery Network)是指内容分发网络,也称为内容传送网络。通过广泛的网络节点分布,提供快速、稳定、安全、可编程的全球内容分发加速服务,可以将静态资源文件(html静态页面,js,css,图片,音视频,文件等)内容分发至接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。
简单说就是用户访问一些静态资源时,使用了CDN后就不会从源服务器上去获取了,而是通过计算,找出距离当前用户最近的CDN服务,返回数据。
二、为什么要用CDN?
比如我们要做一个 商城、视频播放、文件下载 这些类型的网站,里面会包含大量的静态资源文件,而且文件还很大,所以这些网站9成以上网络流量是耗费在静态资源上。如果不做CND优化加速,那么网页加载会消耗源服务器大量的带宽,用户在使用的时候可能会遇到资源迟迟加载不完或者网络中断等一系列问题,所以对于这些类型的网站,做CDN优化加速是非常重要的。
三、CND的优点
-
用户访问静态资源时从距离最近的CDN服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻源站点WEB服务器负载等 功能
相当于是一个跨地区的负载均衡,全球各地的CDN服务器, 都在为源站服务器分担访问压力
-
本地Cache加速,快速响应
本地用户访问本地CDN服务器,不需要访问远处的源站服务器,通信距离短了,自然响应快速
集群抗攻击:广泛分布的CDN节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵以及降低各种DDoS攻击对网站的影响,同时保证较好的服务质量。
-
镜像服务:能够消除不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量。
比如用户用的联通网络,访问电信网络的源站web服务,会跨运营商,访问线路会先到达联通顶层主干网络,再分发到电信顶层主干网络,最后到达源站服务器,这一过程是很漫长的。如果部署了联通的CDN服务器,那么联通用户访问就会直接从距离最近的联通CDN上获取数据了,速度自然提升很多。
节省骨干网带宽,减少带宽需求量
四、搭建CDN服务
CDN可以直接在服务商平台付费购买,比如:阿里云、腾讯云、百度云等。这个没啥好说的,这里主要讲下自己搭建CDN。
这里用到两台centos7.8的服务器来演示搭建过程
第一台服务器做源站web服务器,需要部署 nginx 和一些静态资源文件
第二台服务器做CDN服务器,需要部署 nginx 和 squid(高性能的缓存服务器,可以单独放在别的服务器上)
源站服务器配置
mkdir /etc/yum.repos.d/bacakup
mv /etc/yum.repos.d/* /etc/yum.repos.d/bacakup
wget -O /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
# 上面这几步作用是给centos设置下yum源,这样使用yum下载东西会快一点。也可以不进行这些操作
yum install nginx
service nginx start
CDN服务器配置
nginx 与上面一致,完成后需要改下配置
vi /etc/nginx/nginx.conf
location / {
proxy_pass http://192.168.111.130:3128; #填写squid服务器的IP和端口,3128是squid默认端口
}
安装squid
yum install squid
vi /etc/squid/squid.conf
http_port 3128 accel vhost vport #设置squid的端口
cache_peer 192.168.111.120 parent 80 0 originserver #增加这一行配置,表示CDN上没有缓存数据时从哪去拉取数据,IP就是源站的IP,端口也是一样
service squid start
五、测试
在源站上新建test.js文件,然后用CDN的IP去访问这个文件,发现也可以打开,证明搭建及配置没有问题
PS:我第一次测试的时候出现个问题,nginx和squid都启动了,配置也没问题,但是访问CDN的IP就报502错误,查看了nginx的错误日志,将错误信息通过百度,用了这一条命令解决的
setsebool -P httpd_can_network_connect 1
六、配置域名解析
通过上边的操作,成功的搭建了CDN服务器,但是还差一步,就是域名解析。上边直接访问CDN的IP加文件名可以获取到源站的数据,但是实际操作中我们不会直接访问CDN的IP或者域名,而是访问的源站的IP或域名,所以还需要将源站域名解析到CDN服务器的域名,这样才会在实际访问中生效(请求源站域名就会自动解析到就近的CDN服务器)
因为我没有域名,截不了图,大致讲一下,就是用 CNAME 将源站域名指向CDN域名
七、详解下squid
nginx都熟悉,不用多说,主要讲下squid。Squid是一个高性能的代理缓存服务器,它的作用就是被访问时可以向配置的源站地址获取数据并且缓存起来,如果缓存的文件发生了变化squid也会自动更新的。
正因为squid性能高,而且好用,安装配置很简单,所以用它来构建CDN加速,也是当前比较主流的软件。
squid配置文件详解
# 官网推荐配置,允许访问的IP和端口的ACL
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
#定义了Safe_ports所代表的端口
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
#定义CONNECT代表http里的CONNECT请求方法
acl CONNECT method CONNECT
acl PURGE method PURGE
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access allow PURGE localhost
http_access allow PURGE localnet
http_access deny PURGE all
http_access deny manager
http_access allow localnet
http_access allow localhost
#错误页面缓存设置
acl badurl http_status 403-404 500-
http_access deny badurl
#自定义允许访问域名的ACL,协议,端口
acl denyHost dstdomain app.go-news.com
acl accessHostA dstdomain .go-news.com
acl accessHostB dstdomain .test.com
acl accessProtocol proto HTTP
acl accessPort port 80
#设定对ACL的访问策略
http_access allow accessProtocol accessPort accessHostA
http_access allow accessProtocol accessPort accessHostB
http_access deny accessProtocol accessPort denyHost
#拒绝其他所有请求
http_access deny all
###########反向代理相关设置#################################
#设置反向代理服务器监听的端口为3128,accel表示开启squid的accel加速模式,
#vhost和vport表示支持虚拟主机和虚拟端口,如果再加上transparent表示支持透明代理
http_port 3128 accel vhost vport
#cache_peer表示如果本机缓存中找不到客户端请求的数据,将与主机www.zcu.com以parent类型进行联系,no-query表示不使用ICP协议进行联系,
#而是使用HTTP协议进行联系,no-digest表示代理服务器之间不做摘要表查询,直接用ICP协议沟通(同级代理)。端口是80,orginserver表示此服务器是源服务器,name表示别名。
cache_peer 192.168.4.156 parent 80 0 no-query no-digest originserver name=Server_go
cache_peer 192.168.111.120 parent 80 0 originserver
#设置别名所对应的域名,如果cache_peer中使用域名而不是IP的话,那么cache_peer_domain中一定要用相同的域名,否则无法访问
cache_peer_domain Server_te image.go-news.com
cache_peer_domain Server_go www.go-news.com
#################缓存相关参数设置################
#设置缓存内存大小,最大使用内存为512M,
#当使用超过95%时开始对缓存进行替换,直到下降到90%后停止
cache_mem 512 MB
cache_swap_low 90
cache_swap_high 95
#设置内存中最大可缓存的最大文件大小
maximum_object_size_in_memory 128 KB
#设置磁盘中可缓存的最大文件大小
maximum_object_size 65536 KB
minimum_object_size 0 KB
#设置缓存文件夹的路径和参数,10240表示10G大小,目录下面分为16级,每级又有256个目录
cache_dir ufs /data/cache 10240 16 256
#内存和硬盘cache的替换策略
memory_replacement_policy lru
cache_replacement_policy lru
#设置缓存日志文件路径
logformat main %>a %{%Y-%m-%d %H:%M:%S}tl %>Hs %h %Ss:%Sh
access_log /usr/local/squid/var/logs/access.log main
cache_log /dev/null
cache_store_log none
#关闭该项,这样就可以显示用户的整个请求内容
strip_query_terms off
#禁止squid的出错页面总会在网页的最下方显示主机相关信息和squid的版本信息
httpd_suppress_version_string on
#设置针对错误status代码缓存,如403、404等。如果不缓存则设置0
#negative_ttl 10 second
#设置用户请求的HTTP头大小
request_header_max_size 128 KB
#设置用户的真实IP地址通过X-Forwarded-For中传递下去
forwarded_for on
#http1.0的vary信息里带有过期时间的话,squid还是不能缓存住。打开此选项提高缓存命中率
vary_ignore_expire on
#修改默认缓存时间,默认是60s,解决当Expires设置为60秒以内时都不会Cache但当设置成61秒时就能Cache
minimum_expiry_time 10 seconds
#合并回源,多个回源流量变成一个回源,这个在大文件时,也比较有用。
collapsed_forwarding on
#refresh_pattern 控制文件过期的,percent与Min、Max(都是分钟)两个值是完全没有关系
#1.缓冲对象在squid的cache缓冲的时间大于refresh_pattern定义的max,该响应过期
#2.缓冲对象在squid的cache缓冲的时间大于(原始数据进入squid的缓冲的时间-原始web数据所规定的Last-Modified时间)*percent,该响应过期
#开头是ftp的话,那么在一天(1440分钟)后,如果proxy 再次取用这个档案时,则cache内的数据会被更新
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern (cgi-bin|\?) 0 0% 0
refresh_pattern . 0 20% 4320