CDN原理与搭建

#######################################################
        varnish
一、varnish是用来干什么的:
   varnish作用是访问web速度的web加速器,被安装在web服务器之前,从而缓存web服务器的应用程序和数据,最后相应客户的请求。  功能与Squid服务器相似,都可以用来做HTTP缓存。
  与Squid不同之处在于,Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,所以Varnish要相对更高效,但也有缺点,内存中的缓存在服务器重启后会丢失


二、
1.Varnish的初始化过程:
varnish启动会产生两个进程:master进程 和 child进程
   master进程:master进程负责启动工作,master进程会读取配置文件,根据指定的配置信息做出相应的动作,例如管理员在配置文件中分配了2G内存大小,它就会在内存中创建2G的存储空间; master进程还会创建并管理child进程。
   child进程: child进程来处理后续任务,它会分配一些线程来执行不同的工作,例如:(1). 接受http请求 (2).为缓存对象分配存储空间  (3).清除过期缓存对象(4). 释放空间 碎片整理

2. 分配缓存过程:有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去
如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块
如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则。

3.释放缓存过程:有一个线程来负责缓存的释放工作,他定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间; 释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合为一个更大的空闲块,实现空间碎片的整理


4.VCL(varnish configuration Langage)语言 相关:

1)
  VCL语言被使用在default.vcl这个文件中,用来设置varnish服务器对后端web服务器加速的一些规则;  vcl是一种区域配置语言。在执行vcl时,varnish会将vcl语言转化未二进制代码; default.vcl文件中的vcl语言被分为多个子程序, 不同的子程序在不同的时间点执行,比如有的子程序在接收到客户端请求时执行,有的子程序在接收到后端服务器的文件时执行。

2) backend servers(后端服务器)
    一般来说就代表web服务器,提供varnish加速的内容,即varnish缓存内容的源头。
   
    在/etc/varnish/default.vcl文件中会配置相关信息和规则,告诉varnish服务器应该去哪里寻找缓存的内容

3)vcl_recv
  该子程序在请求的开始被调用,在接收、解析了客户端的请求后,该子程序会决定是否响应请求、怎么响应请求以及使用哪个后台服务器响应请求。

4)actions:
主要有一下动作 :
  pass:当一个请求被 pass 后,这个请求将通过 varnish 转发到后端服务器,
但是它不会被缓存。pass 可以放在 vcl_recv 和 vcl_fetch 中。

lookup:当一个请求在 vcl_recv 中被 lookup 后,varnish 将从缓存中提取数
据,如果缓存中没有数据,将被设置为 pass,不能在 vcl_fetch 中设置 lookup。

pipe:pipe 和 pass 相似,都要访问后端服务器,不过当进入 pipe 模式后,在
此连接未关闭前,后续的所有请求都发到后端服务器

deliver:请求的目标被缓存,然后发送给客户端

5)3个重要的数据结构:Requests、Responses 、 objects

req:请求目标,当 varnish 接收到一个请求,这时 req object 就被创建了,
你在 vcl_recv 中的大部分工作,都是在 req object 上展开的。

beresp:后端服务器返回的目标,它包含返回的头信息,你在 vcl_fetch 中的
大部分工作都是在 beresp object 上开展的。

obj:被 cache 的目标,只读的目标被保存于内存中,obj.ttl 的值可修改,其
他的只能读。

6)两个varnish服务器上的监控命令:
varnishlog

varnishtop


三、搭建varnish服务器,实现简单的web缓存:

1. 下载相关软件:

2. 编辑/etc/sysconfig/varnish
    1) 修改端口
    2) 看varnish 对文件、内存、进程的限定
        对比真机对文件、内存、进程的限制  sysctl -a | grep file/mem/ 或者直接用ulimit -a查看


3. 编辑配置文件: /etc/security/limits.conf
    在该文件中添加运行varniash所要求的文件、内存、进程的大小,
    一个计算机 文件、内存及进程的量级是由硬件决定,    
    所以在正常生产环境中配置varnish时,硬件必须达
    到vanish运行的要求。

4. 编辑配置文件: /etc/varnish/default.vcl
    添加要备份的服务器主机的ip和访问的端口

5. 开启varnish服务
    这时候若正常,varnish会开启两个进程,一个由root用户开启,一个由
    varnish用户开启,root用户是门迎, varnish用户相当于大堂经理
    ,一个负责监听,一个负责分工作线程,若有客户来访问则分一个子线程
    去访问varnish服务器

6. 在另外一台虚拟机上开启http服务


7. 测试 curl 172.25.9.2


四、 测试客户端是否命中实验:

1. 配置文件 /etc/varnish/default.vcl
sub vcl_deliver {
        if (obj.hits > 0) {
        set resp.http.X-Cache = "Hit from server3 cache";
        }
        else {
        set resp.http.X-Cache = "Miss from server3 cache";
        }
        return (deliver);
        }

2. 重新载入varnish服务:
      etc/init.d/varnish reload

   切忌:不能重启服务,要载入服务,重启服务会清除掉缓存信息

3. 测试 curl -I 172.25.9.2

    第一次:X-Cache: Miss from server3 cache
           Age: 0

    第二次:X-Cache: Hit from server3 cache
          Age: 4

五、 如何更新缓存:

1. 手动清除缓存:
    varnishadm ban.url .*$

2.自动清除缓存: vim /etc/sysconfig/varnish
    VARNISH_THREAD_TIMEOUT=120(默认是120s)
    有问题:动态其实没做明白,配置后不自动清除缓存


六、 如何配置varnish,让其实现多个web服务器的访问加速:

1. 配置文件: /etc/varnish/default.vcl
    ## 配置对第一个web服务器进行缓存
    backend web1 {
      .host = "172.25.9.3";
      .port = "80";
    }
    ## 配置对第二个web服务器进行缓存
    backend web2 {
     .host = "172.25.9.4";
      .port = "80";
    }
    ##用正则进行匹配:
    sub vcl_recv {
    if (req.http.host ~ "^(www.)?245room.org") {
    set req.http.host = "www.245room.org";
    set req.backend = web1;
    } elsif (req.http.host ~ "^bbs.245room.org") {
    set req.backend = web2;
    } else {error 404 "245room cache";
    }
    }

2. 在客户端配置解析
vim  /etc/hosts
    172.25.9.2  server1 www.245room.org  bbs.245room.org hello.org

 

3. 测试:
    curl www.245room.org
    curl bbs.245room.org

 


六、 定义后端服务器的负载均衡:

1. 配置文件:/etc/varnish/default.vcl
    #
    backend web1 {
        .host = "172.25.9.3";
        .port = "80";
    }

    backend web2 {
        .host = "172.25.9.4";
        .port = "80";
    }

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

    sub vcl_recv {
    if (req.http.host ~ "^(www.)?245room.org") {
    set req.http.host = "www.245room.org";
    set req.backend = lb;
    return (pass);
    } elsif (req.http.host ~ "^bbs.245room.org") {
    set req.backend = web1;
    } else {error 404 "245room cache";
    }
    }

问题: 若是轮询的方式去实现负载均衡,是否就要放弃varnish缓存的功能

2. 测试
[root@foundation9 images]# curl www.245room.org
server 2
[root@foundation9 images]# curl www.245room.org
server4

[root@foundation9 images]# curl www.245room.org
server 2
[root@foundation9 images]# curl www.245room.org
server4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(CDN)