cdn内容分发网络

CDN内容分发网络

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
今天我们来应用cdn来发布多台服务器的内容,不仅用来加速客户端访问网络的速度,还可以分担服务器的压力.避免因为访问量过大,导致服务器的雪崩,当然也提高了网络数据的稳定性.
首先小编为大家带来的是环境的部署,在企业中我们要操作多台企业6.5的服务器,因此我们制作了6.5版本的最简母盘,然后制作了几个子盘。

母盘设置:

母盘虚拟机 base rhel6.5->512MB 最小化安装选用RAM为512MB默认为最小化安装,这样的环境比较简易:


内存大小:

母盘命名为base

键盘设置:


跳过检测:

区域选择:

超户密码:


分区类型:

初始化所有:

写入磁盘:

完成reboot

封装母盘:

ip设置:

yum 源配置:

更改主机名和域名解析:

火墙iptables:

SELINUX:

物理机上面制作base子盘

virt-sysprep --help
如果没有该命令需要yum whatprovides virt-sysprep
1 yum install /usr/bin/virt-sparsify
压缩母盘,一般当需要copy母盘文件时
#virt-sysprep --compress base.qcow2 new.qcow
2 cd /var/lib/libvirt/images/
3 ls
4 ll base.qcow2
5 virt-sysprep -d base # 清除缓存


在图形环境中删除母盘但不删除母盘源文件为了以后不打开母盘动用母盘中的东西

1  virt-manager 
2  qemu-img create  -f qcow2 -b base.qcow2 test1 #用base.qcow2建立子盘test1
3  qemu-img create  -f qcow2 -b base.qcow2 test2
4  qemu-img create  -f qcow2 -b base.qcow2 test3
5  ls
6  du -sh base.qcow2  #查看base母盘容量
7  du -sh test1 
8  du -sh test2
9  du -sh test3


在virt-manager中添加已有镜像test1
import existing disk image
并给添加的虚拟机命名为test1 OS type linux Version rhel6.5

所有的操作都存储在子盘中
如果删掉了/etc 当重新启动时,虚拟机起不来不用着急,把坏掉的子盘文件删掉重新制作
添加就ok
实验:(子盘终端)dd if=/dev/zero of=file bs=1M count=100
在物理机中查看子盘容量会增加100M du -sh 子盘文件

1 qemu-img info test1 #查看子盘的母盘是谁
2 systemctl status libvirtd
当关闭libvirtd时,在virt-manager中是看不见这些子盘的,但他们还是工作的
我们可以用ssh 连接它,也可以ping
3 systemctl stop libvirtd
4 virsh list
在物理机中vnet0上没有桥接怎么办
ip link set up dev vnet0


kvm(cpu,memory)+qemu(disk,net,i/o)
虚拟机操作:
virsh start test1 #开启test1子盘虚拟机

cdn实验:

客户端一般访问数据的程序:

client->dns->cdn->server->cdn->cache->client

在这里我们让server1作为cdn服务器:
server2作为http后台终端服务器:

varnish

主机环境: rhel6 selinux and iptables disabled
实验主机: 172.25.30.250
 varnish
172.25.30.1
 apache
172.25.30.2
 apache
172.25.30.3

VCL 处理流程图


处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。

扫描二维码关注公众号,回复: 2719354 查看本文章
**varnish**
yum install varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
内核参数<-操作系统<-程序
vim /etc/security/limits.conf #操作系统
vim /etc/sysconfig/varnish/ #varnish参数配置设置
vim /etc/varnish/default.vcl #程序主配置文件

varnish参数设置:
当需要在多台服务器上面缓存数据,就需要Varnish映射所有的URL到一台单独的主机

NFILES========可以打开的最大文件数目
MEMLOCK=====存储锁定
NPROCS======进程要求
VARNISH_LISTEN_PORT=80 =========修改VARNISH监听端口,当Varnish需要访问后端服务器时,就会访问自己的80端口.
RELOAD_VCL=1====Varnish指定重新reload varnish的时候,重新reload一下VCL配置文件
VARNISH_VCL_CONF=/etc/varnish/default.vcl #Varnish默认主配置文件
VARNISH_MIN_THREADS=50 #等待连接后端的最短时间
VARNISH_MAX_THREADS=1000
VARNISH_THREAD_TIMEOUT=120 #Varnish中的数据超过120s就会过期
VARNISH_STORAGE_SIZE=1G #存储空间
VARNISH_SECRET_FILE==指定shell接口使用的密钥文件
指定varnish进程的属主和属组
VARNISH_USER=varnish
VARNISH_GROUP=varnish# 指定运行时的参数,使用-p选项来指定,thread_pools=6:表示启用6个线程池,thread_pool_min=5:表示每个线程池里面最少5个线程,thread_pool_max=500:表示每个线程池里面最大500个线程,thread_pool_timeout=300:表示线程的请求超时时长
DAEMON_OPTS=”-p thread_pools=6 -p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300”


    1  vim /etc/sysconfig/varnish
    2  /etc/init.d/varnish restart
    3  sysctl -a |grep file


根据varnish的参数设置,将系统的内核参数也设置和他匹配从而加快varnish缓存速度:
vim /etc/security/limits.conf

在后端服务器上面发布index.html

1 yum install httpd
2 /etc/init.d/httpd start
3 vim /var/www/html/index.html


配置一个后端服务器:
测试是否发布:

1 vim /etc/varnish/default.vcl 
配置一个后端服务器
backend web1 {
  .host = "172.25.30.2";
  .port = "80";
}
查看缓存命中情况
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);
}
2 /etc/init.d/varnish restart


在客户端测试查看发布的信息是否被varnish缓存命中:

   1  vim /etc/hosts #本地域名解析
   2  curl -I www.westos.org
   X-Cache: HIT from westos cache #命中
   X-Cache: MISS from westos cache #未命中
1:req.:由客户发来的http请求相关
req.http.:拿到请求报文各个首部值
例如:req.http.Cookie 拿到请求报文中的Cookie首部的值
2:resp.:由varnish响应给client的http响应报文
resp.http. :响应报文的各个首部
例如:set resp.http.X-Cache = "HIT from " + server.hostname 给X-Cache首部赋值
3:bereq.:由varnish向backend主机发出的http请求 (backend request:后端主机的请求报文)
bereq.http. :向backend主机发送的请求报文的对象
4:beresp.:由backend主机发来的http响应报文
beresp.http. :由backend主机发来的http的响应报文的对象
5:obj. :存储在缓存空间中的缓存对象属性
 在编写vcl配置文件中,常用的对象,已经对象的意义说明

定义多个不同域名站点的后端服务器:

server3:添加一个http服务器2

 1  yum install httpd -y
 2  /etc/init.d/httpd start 
 3  vim /var/www/html/index.html


varnish配置多台http服务器:

vim /etc/varnish/default.vcl
定义多个不同域名站点的后端服务器
#当访问www.westos.org 就会从web1(172.25.30.2)中取数据缓存到cdn中,
当访问bbs.westos.org 就会从web2(172.25.30.3)中取数据缓存到cdn中
backend web1 {
  .host = "172.25.30.2";
  .port = "80";
}
backend web2 {
  .host = "172.25.30.3";
  .port = "80";
}
#当访问 www.westos.org 域名时从 web1 上取数据,访问 bbs.westos.org 域名时到 web2 取数据,访问其他页面报错。
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";}
}

客户端访问查看是否命中:
<1>当没有(req.http.host ~ “^(www.)?westos.org”)时在客户端访问westos.org时是不能识别和命中的

<2>当添加(req.http.host ~ “^(www.)?westos.org”)时在客户端访问westos.com相当于访问www.westos.com


<3>访问bbs.westos.com即访问服务器3

把一个文件发布到两个服务器上面,从而缓解后台服务器的压力,提高数据的稳定性,这种情况多用于当访问量过大时负载均衡到两个服务器上,即使有一个服务器坏掉了,还有一个服务器来顶替他的工作。varnish还是可以从终端的服务器中取出客户端访问的数据缓存起来。
在server3上面发布和server2上一样的网页.

1 mkdir /www1/
2 vim /www1/index.html
www.westos.org --server3/http
vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80 
#当访问bbs.westos.org域名时,系统默认发布根目录为/var/www/html
<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName bbs.westos.org
</VirtualHost>
#当访问bbs.westos.org域名时,系统默认发布根目录为/www1
<VirtualHost *:80>
    DocumentRoot /www1
    ServerName www.westos.org
</VirtualHost>
3 /etc/init.d/httpd restart


varnish上面部署负载均衡

1 vim /etc/varnish/default.vcl 
## 轮循分配方法round-robin  lb(自定义命名):
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,当访问www.westos.org时,轮循访问web1,web2
#return (pass);
# http中pass生效表示不在cdn中取缓存数据,直接在后台取数据,这样的话,varnish没有起到任何作用相当于负载均衡,他只是为了在测试中更好的看到实验效果,实际中不需要添加.实验中当清空了缓存数据,有一端的后台服务器挂掉之>后,另一个服务器会顶替他,如果挂掉的服务器数据还在有效期,还是可以在cdn中方问到
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
2 /etc/init.d/varnish reload


pass可以让我们更好地看到实验效果,但他是直接跳过cdn直接从服务器中取数据,并没有什么实际作用。

注释掉pass之后,我们可以看到客户端访问数据时,如果有一个服务器坏掉了,varnish还是可以从另一个服务器中缓存数据
我们可以看到即便down掉了后台的一个服务器,在他被varnish缓存数据没有过期时,客户端还是可以访问到,但当他的数据过期时,就要从另一个服务器中缓存了,可以证明,我们访问的数据是从cdn缓存中取到的

当我们在cdn上把从服务器上缓存清空时,如果有一个服务器坏掉了我们依然能够访问到但此时只有从开启的服务器中缓存数据
![](https://img-blog.csdn.net/2018072814594823?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RyZWFtZXJfeGl4aXhp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

通过 varnishadm 手动清除缓存

# varnishadm ban.url .*$
#清除所有
# varnishadm ban.url /index.html
#清除 index.html 页面缓存
# varnishadm ban.url /admin/$
#清除 admin 目录缓存

CDN推送平台:

  • 应用于网站信息已经更新但是还在cdn中缓存这样就会导致用户在访问服务器时影响信息的时效性和准确性
  • cdn推送:清除缓存信息,推送什么,清除什么
  • http终端服务器服务要打开:
  • 在cdn服务器上面安装httpd,为了避免和cdn端口冲突,需要将端口改为8080,这里的http安装是为推送cdn平台
vim /etc/httpd/conf/httpd.conf #修改cdn中的http端口避免和cdn冲突
/etc/iniit.d/httpd reload
安装yum install bansys.zip php #banzip.zip给压缩包解压,php推送平台是用php语言写的
unzip bansys.zip -d /var/www/html/ #-d指定解压路径
cd /var/www/html/
cd bansys/
mv * /var/www/html/
cd /var/www/html/
vim config.php #更改
#只保留如下设置,其余注释掉
<?php
$var_group1 = array(
'host' => array('172.25.30.1'), #varnish服务端
'port' => '80',
);
//varnish 群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1, 
);
//varnish 版本//2.x 和 3.x 推送命令不一样
$VAR_VERSION = "3";
?>
#bansys 有两种工作模式,分别是:telnet 和 http 模式
#telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
#如果是 http 模式需要对 varnish 做以下设置:
vi /etc/varnish/default.vcl
acl westos {
#设置访问控制
"127.0.0.1";
"172.25.30.1"/24;
}
sub vcl_recv {
if (req.request == "BAN")
{
  if (!client.ip ~ westos)
    {error 405 "Not allowed.";}
    ban("req.url ~ " + req.url);
    error 200 "ban added";
}
             }
# service varnish reload
 #访问推送:172.25.30.1:8080 -->推送文件
crul www.westos.org/index.html

猜你喜欢

转载自blog.csdn.net/dreamer_xixixi/article/details/81259600