varnish搭建cdn网络

一、CDN简介


        CDN的全称是Content Delivery Network,即内容奋发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

市面上有很多CDN供应商,比较著名有

Akamai (全球最大)

chinacache

webluker

cloudflare

chinacache

如果需要自己搭建CDN系统,有3种主流方案可以选择

squid

varnish

Nginx+memcache


二、用varnish实现cdn

  在当前主流的Web架构中,Cache担任着越来越重要的作用。常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键。而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server。严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器。同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一。


1.安装包

varnish搭建cdn网络

2.安装

# yum install varnish * -y

3.修改varnish监听的端口

# vim /etc/sysconfig/varnish

VARNISH_LISTEN_PORT=80

4.修改/etc/varnish/default.vcl

如果varnish里面找不到,到哪个主机上面找

varnish搭建cdn网络

4.开启varnish

# /etc/init.d/varnish start


实验1:查看缓存命中情况

在default.vcl里面添加

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);
}


重启varnish,测试缓存命中情况

varnish搭建cdn网络

varnish搭建cdn网络

用varnishadm清一下缓存,下次访问就不会从缓存中读取


varnish实现负载均衡:

如果找不到就到web1,或web2上找,web1上是nginx,web2是apache

varnish服务器上做的:

修改default.vcl

backend web1 {
  .host = "172.25.90.1";
  .port = "80";
}
backend web2 {
  .host = "172.25.90.2";
  .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;
#return (pass);
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}


director lb round-robin {
{ .backend = web1; }
{ .backend = web2; }
}


在web1上要做的:

安装nginx,并开启

在web2上要做的:

装好apache,并开启apache

varnish搭建cdn网络

配好web2上的解析:/etc/hosts

varnish搭建cdn网络

建好发布目录和发布文件,并启动apache

varnish搭建cdn网络

最后在varnish要做的:

重启varnish

# /etc/init.d/varnish reload


在客户端测试要做的:

修改客户端的/etc/hosts

varnish搭建cdn网络

用浏览器访问:如果不出错的话,一只刷新页面会发现一会是web1的发布页,一会儿是web2的发布页


三、varnish的工作原理

Management进程:对子进程进行管理,同时对VCL配置进行编译,并应用到不同的状态引擎。

    Child进程:生成线程池,负责对用户请求进行处理,并通过hash查找返回用户结果。

varnish搭建cdn网络

状态引擎

      每一个状态引擎处理结束之后,都会将结果returnvarnish,由varnish决定下一个状态引擎。由于每个引擎的下一个处理引擎都是特定的,所以return的值基本上也是确定的,可以通过官方文档获取。各引擎的处理流程图如下:

varnish搭建cdn网络

vcl_recv : 接收用户请求,判断是否是可缓存数据。
    vcl_pipe :不可缓存数据,直接管道后端处理
    vcl_hash :可缓存数据,通过hash机制处理,默认url做key;也可以自定义区分客户端是否支持处理压缩数据而判断区分缓存。
        vcl_hit : 命中          
        vcl_miss :未命中          vcl_fetch : 后端取数据
             vcl_pass :给命中或者未命中的数据提供一个特殊位置以对请求的数据进行特殊处理
vcl_deliver: 1.hit直接deliver; 2.fetch直接deliver


处理请求流程:

varnish搭建cdn网络

四、CDN推送管理


varnish帮我们缓存很多的web资源,但是当后台的数据有了变化需要更新怎么办,此时就需要用到CDN的推送管理了

1.安装apache,PHP,设置apache在8080端口,并且启动服务

# yum install httpd php -y

# /etc/init.d/httpd start                  


2.将bansys.zip解包,包里面的内容统统放到apache的发布目录下


3.修改发布目录下的config.php

varnish搭建cdn网络

# vim /etc/varnish/default.vcl

varnish搭建cdn网络

director lb round-robin {
{ .backend = web1; }
{ .backend = web2; }
}

varnish搭建cdn网络

# 重启varnish


varnish搭建cdn网络

推荐阅读:

CDN实现方案如何选择: squid Varnish Nginx:http://www.server110.com/varnish/201404/9972.html