美文网首页
使用varnish构建一个CDN拓扑

使用varnish构建一个CDN拓扑

作者: ivan_cq | 来源:发表于2018-12-04 18:05 被阅读0次

    关于cdn介绍不错的博客:https://www.cnblogs.com/skynet/archive/2012/12/18/2824141.html
    有问题可以联系本博主:486097289@qq.com


    cdn,(content delivery network)全称内容分发网络,是一种拓扑结构。这种结构使得用户可以就近访问服务器,从而提高用户访问速度,减轻服务器压力,提高网站的稳定性和安全性。


    cdn的原理:
    1、将内容推送到边缘节点(将原始服务器的内容拷贝到镜像服务器中生成副本)。
    2、引导用户就近访问。
    正常的一个web访问过程:用户在浏览器上输入域名,浏览器发送到dns服务器进行域名解析,dns服务器解析到域名对应的ip地址返回给浏览器,浏览器发送请求到ip地址相应的服务器,服务器返回请求结果,浏览器对这个结果进行一个可视化的展现。
    cdn加速过后的一个web请求过程:用户在浏览器中输入域名,浏览器将该域名发送给dns服务器,dns服务器将该域名解析到对应的智能dns服务器中,智能dns服务器获取了请求,进行判断,返回了一个距离客户端最近的镜像服务器ip地址,浏览器访问镜像服务器,服务器返回请求结果,浏览器进行了一个可视化的展现。


    cdn的分类:
    按照内容分类,网页加速,流媒体加速,大文件加速,应用协议加速。
    按照推送类型分为主动推送和被动获取两种。


    cdn的命中率:
    cdn的是实现原理就是将我们的文件缓存到各个不同节点的服务器上从而生成镜像服务器,既然是缓存就会有有效时间,如果成功使用缓存就是命中缓存,否则就是未命中。
    举个例子:用户向cdn服务器发送了10个请求经过cdn服务器的过滤,cdn服务器向源服务器发送3个请求,那么cdn的命中率就是70%。
    命中率十分重要:命中率越高,对象存储的流量费用就越低,对象存储的请求次数就越低。所以设置合适的缓存过期时间,但是也不要为了提高缓存命中率而降低用户体验。


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


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

    实验环境:
    server1:172.25.4.1
    server2:172.25.4.2
    需要安装包:
    varnish-3.0.5-1.el6.x86_64.rpm  varnish安装包
    varnish-libs-3.0.5-1.el6.x86_64.rpm
    

    1、在server1上安装varnish

    [root@server1 ~]# ls
    varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
    [root@server1 ~]# yum install * -y
    

    2、配置varnish服务端口

    [root@server1 ~]# vim /etc/sysconfig/varnish
    VARNISH_LISTEN_PORT=80
    

    我们查看varnish配置文件,可以发现varnish运行时的一些细节

    # Maximum number of open files (for ulimit -n)
    NFILES=131072                
    
    # Locked shared memory (for ulimit -l)
    # Default log size is 82MB + header
    MEMLOCK=82000
    
    # Maximum number of threads (for ulimit -u)
    NPROCS="unlimited"
    

    所以我们需要使得目前环境支持varnish的这些能力

    [root@server1 ~]# vim /etc/security/limits.conf 
    [root@server1 ~]# tail -n 5 /etc/security/limits.conf 
    
    # End of file
    varnish     -   noflie      131072
    varnish     -   memlock     82000
    varnish     -   nproc       unlimited
    

    3、增加varnish后端,重启服务
    [root@server1 ~]# vim /etc/varnish/default.vcl


    [root@server1 ~]# /etc/init.d/varnish start
    Starting Varnish Cache:                                    [确定]
    

    4、配置一个后端服务器server2,并且写入默认发布页面

    [root@server2 ~]# yum install httpd -y
    [root@server2 ~]# /etc/init.d/httpd start
    正在启动 httpd:httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.4.2 for ServerName
                                                               [确定]
    [root@server2 ~]# echo server2 > /var/www/html/index.html
    [root@server2 ~]# cat /var/www/html/index.html 
    server2
    

    5、在别主机访问server1的ip地址

    [root@ivans varnish]# curl 172.25.4.1
    server2
    [root@ivans varnish]# curl -I 172.25.4.1
    HTTP/1.1 200 OK
    Server: Apache/2.2.15 (Red Hat)
    Last-Modified: Tue, 04 Dec 2018 07:55:46 GMT
    ETag: "bf983-8-57c2d97d163b9"
    Content-Type: text/html; charset=UTF-8
    Content-Length: 8
    Accept-Ranges: bytes
    Date: Tue, 04 Dec 2018 07:57:34 GMT
    X-Varnish: 49127286 49127285
    Age: 5
    Via: 1.1 varnish
    Connection: keep-alive
    

    6、在varnish查看缓存命中情况

    [root@server1 ~]# vim /etc/varnish/default.vcl 
    [root@server1 ~]# /etc/init.d/varnish restart
    Stopping Varnish Cache:                                    [确定]
    Starting Varnish Cache:                                    [确定]
    

    在varnish的配置文件中添加可以查看缓存命中的模块,并重新启动服务

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

    7、查看缓存命中情况

    HTTP/1.1 200 OK
    Server: Apache/2.2.15 (Red Hat)
    Last-Modified: Tue, 04 Dec 2018 07:55:46 GMT
    ETag: "bf983-8-57c2d97d163b9"
    Content-Type: text/html; charset=UTF-8
    Content-Length: 8
    Accept-Ranges: bytes
    Date: Tue, 04 Dec 2018 08:03:00 GMT
    X-Varnish: 2089398278
    Age: 0
    Via: 1.1 varnish
    Connection: keep-alive
    X-Cache: Miss from westos cache
    
    [root@ivans varnish]# curl -I 172.25.4.1
    HTTP/1.1 200 OK
    Server: Apache/2.2.15 (Red Hat)
    Last-Modified: Tue, 04 Dec 2018 07:55:46 GMT
    ETag: "bf983-8-57c2d97d163b9"
    Content-Type: text/html; charset=UTF-8
    Content-Length: 8
    Accept-Ranges: bytes
    Date: Tue, 04 Dec 2018 08:03:02 GMT
    X-Varnish: 2089398279 2089398278
    Age: 2
    Via: 1.1 varnish
    Connection: keep-alive
    

    第一次,缓存未命中,第二次缓存显示命中。


    实验2:定义多个不同站点的后端服务器

    环境:在上一个实验的基础上增加了server3
    server1: 172.25.4.1
    server2: 172.25.4.2
    server3: 172.25.4.3
    

    1、在server3上安装httpd,写入默认发布页面

    [root@server3 ~]# yum install httpd -y
    [root@server3 ~]# /etc/init.d/httpd start
    正在启动 httpd:httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.4.3 for ServerName
                                                               [确定]
    [root@server3 ~]# echo server3 > /var/www/html/index.html
    [root@server3 ~]# cat /var/www/html/index.html 
    server3
    

    2、在server1上修改varnish配置文件,添加后端服务器server3

    [root@server1 ~]# vim /etc/varnish/default.vcl 
    [root@server1 ~]# /etc/init.d/varnish restart
    Stopping Varnish Cache:                                    [确定]
    Starting Varnish Cache:                                    [确定]
    
    backend web1 {
      .host = "172.25.4.2";
      .port = "80";
    }
    
    backend web2 {
      .host = "172.25.4.3";
      .port = "80";
    }
    
    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";}
    }
    
    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);
    }
    
    

    3、在真机对varnish服务器添加解析

    [root@ivans varnish]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    172.25.4.1  server1 www.westos.org bbs.westos.org
    

    4、在真机测试



    实验三:实现负载均衡,健康检查

    环境是基于上一个实验的
    1、在server3中添加一个阿帕其虚拟主机
    [root@server3 ~]# vim /etc/httpd/conf/httpd.conf
    打开虚拟主机的开关,并添加一个虚拟主机的文件

    NameVirtualHost *:80
    ........
    <VirtualHost *:80>
        DocumentRoot /var/www/html
        ServerName bbs.westos.org
    </VirtualHost>
    
    <VirtualHost *:80>
        DocumentRoot /www
        ServerName www.westos.org
    </VirtualHost>
    
    
    [root@server3 ~]# vim /etc/httpd/conf/httpd.conf 
    [root@server3 ~]# mkdir /www
    [root@server3 ~]# echo server3---virtual > /www/index.html
    [root@server3 ~]# cat /www/index.html 
    server3---virtual
    [root@server3 ~]# /etc/init.d/httpd restart
    停止 httpd:                                               [确定]
    正在启动 httpd:httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.4.3 for ServerName
                                                               [确定]
    

    记得在server3上添加本地解析

    测试

    [root@server3 ~]# curl www.westos.org
    server3---virtual
    [root@server3 ~]# curl bbs.westos.org
    server3
    

    2、把server1上多个后端服务器聚合成一个组
    命名一个组" lb "

    backend web1 {
      .host = "172.25.4.2";
      .port = "80";
    }
    
    backend web2 {
      .host = "172.25.4.3";
      .port = "80";
    }
    
    director lb round-robin {                      #封装成一个组,名称为lb
    { .backend=web1; }
    { .backend=web2; }
    }
    
    sub vcl_recv {
    if (req.http.host ~ "^(www.)?westos.org") {      #由于server2和server3的虚拟主机域名都是www.westos.org,所以对这个进行负载均衡处理
    set req.http.host = "www.westos.org";
    set req.backend = lb;
    return(pass);                                                     #设置return(pass)时为了不通过缓存来取内容,这样负载均衡的效果会更明显
    } elsif (req.http.host ~ "^bbs.westos.org") {
    set req.backend = web2;
    } else {error 404 "westos cache";}
    
    }
    
    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);
    }
    
    
    [root@server1 ~]# vim /etc/varnish/default.vcl 
    [root@server1 ~]# /etc/init.d/varnish restart
    Stopping Varnish Cache:                                    [确定]
    Starting Varnish Cache:                                    [确定]
    

    这样就实现了负载均衡的功能。

    [root@server2 ~]# /etc/init.d/httpd stop
    停止 httpd:                                               [确定]
    
    [root@ivans varnish]# for i in {1..10}; do curl www.westos.org ;done
    server3---virtual
    server3---virtual
    server3---virtual
    server3---virtual
    server3---virtual
    server3---virtual
    server3---virtual
    server3---virtual
    server3---virtual
    server3---virtual
    

    当停止了server2的httpd服务,varnish服务器会自动进行健康检查,直接到server3的虚拟主机取数据。

    至此,我们通过了将多个主机聚合成一个组的方式实现了负载均衡和健康检查。


    实验四:varnish推送平台的搭建

    1、在server1上安装httpd并且修改端口为8080防止端口冲突

    [root@server1 ~]# vim /etc/httpd/conf/httpd.conf 
    [root@server1 ~]# /etc/init.d/httpd restart
    停止 httpd:                                               [确定]
    正在启动 httpd:httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.4.1 for ServerName
                                                               [确定]
    
    Listen 8080
    
    

    2、安装php支持
    [root@server1 ~]# yum install php -y

    3、下载bansys.zip的压缩包并解压到http的默认发布目录下

    [root@server1 ~]# ls
    bansys  bansys.zip  varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
    [root@server1 ~]# cd bansys
    [root@server1 bansys]# ls
    class_socket.php  config.php  index.php  purge_action.php  static
    [root@server1 bansys]# mv * /var/www/html/
    [root@server1 bansys]# ls /var/www/
    cgi-bin/ error/   html/    icons/   
    [root@server1 bansys]# ls /var/www/html/
    class_socket.php  config.php  index.php  purge_action.php  static
    

    4、配置解压后的config.php 文件

    [root@server1 html]# ls
    class_socket.php  config.php  index.php  purge_action.php  static
    [root@server1 html]# vim config.php 
    
    [root@server1 html]# /etc/init.d/httpd restart
    停止 httpd:                                               [确定]
    正在启动 httpd:httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.4.1 for ServerName
                                                               [确定]
    [root@server1 html]# /etc/init.d/varnish restart
    Stopping Varnish Cache:                                    [确定]
    Starting Varnish Cache:                                    [确定]
    

    5、varnish配置
    bansys 有两种工作模式,分别是:telnet 和 http 模式。
    telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
    {VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
    如果是 http 模式需要对 varnish 做以下设置:

    acl westos {
     "127.0.0.1";
     "172.25.4.0"/24;
    }
    backend web1 {
      .host = "172.25.4.2";
      .port = "80";
    }
    
    backend web2 {
      .host = "172.25.4.3";
      .port = "80";
    }
    
    director lb round-robin {
    { .backend=web1; }
    { .backend=web2; }
    }
    
    sub vcl_recv {
    if (req.request == "BAN") {
    if (!client.ip ~ westos) {
    error 405 "Not allowed.";
    }
    ban("req.url ~" + req.url);
    error 200 "ban added";
    }
    
    if (req.http.host ~ "^(www.)?westos.org") {
    set req.http.host = "www.westos.org";
    set req.backend = lb;
    } elsif (req.http.host ~ "^bbs.westos.org") {
    set req.backend = web2;
    } else {error 404 "westos cache";}
    }
    
    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);
    }
    

    6、此时,访问172.25.4.1:8080可以查看到cdn推送平台


    7、完成一个推送
    更快更有效的实现后端服务器的某些页面的更新(只需要把更新的内容进行推送即可),让网络信息更加快速更新

    注意我们要选择http模式

    相关文章

      网友评论

          本文标题:使用varnish构建一个CDN拓扑

          本文链接:https://www.haomeiwen.com/subject/nrgmcqtx.html