CDN

CDN Play: Eason

Posted by Orion Blog on November 14, 2020

CDN Play: Eason

简介

CDN content delivery network, 字面翻译:内容分发网络,它利用部署在各地的服务器构建一个网络平台使用GSLB技术引导用户去访问最佳的节点(通常为最近), 而这个节点的CACHE服务由于缓存了请求的内容,从而使得用户访问响应加快,也减轻源站的负载。前面的上半句话对应CDN的控制平面, 而后半句则是数据平面,参考之前的介绍过的Traffic Control Introduction。 这篇文章的目的是更多的从实操角度让读者,包括我更好的理解CDN内部运作原理。同时从CDN维基百科作为 延伸CDN了解的入口点。

场景

namesilo买了域名abc.site(假的😄),备案太麻烦了,所以我们就在某云上购买香港云主机用来建网站,站点域名使用www.abc.site。但是 如果网站的用户大多数是大陆境内,又有新的问题,由于众所周知的GFW, 天朝P民访问大陆境外网络,会时不时的被调戏一下。这时候就该CDN上场了,为了不抽风,我们又在某云上购买了一个 上海的云主机作为加速节点。 构成CDN主要由两个系统组成:GSLB和CACHE, GSLB通常是使用所谓的智能DNS实现,而CACHE使用缓存代理软件。本篇文章使用PowerDNSApache Traffic Server来演示。

img

实操

部署pdns

  1. 参考官方链接, 安装pdns授权器(关于dns递归器和授权器的定义,大家自行google)

     yum install epel-release yum-plugin-priorities -y && curl -o /etc/yum.repos.d/powerdns-auth-44.repo https://repo.powerdns.com/repo-files/centos-auth-44.repo && yum install pdns -y
    
  2. 安装pdns授权器 geo插件(i.e 所谓初级智能dns feature)

     yum install  pdns-backend-geoip -y
    
  3. 安装pdns-backend-geoip需要的地理库

    • 我们需要到maxmind注册,获取License key

    • 在部署的机器上安装geoipupdate,用于下载地理库文件, 编辑/usr/local/etc/GeoIP.conf文件,主要添加3项,如下所示, 最后执行 geoipupdate -v 下载GeoLite2-City.mmdb GeoLite2-Country.mmdb

       AccountID <your_id>
       LicenseKey <your_license_key_from_maxmind>
       EditionIDs GeoLite2-Country GeoLite2-City
      
  4. 配置pdns-backend-geoip

    • 修改pdns.conf

        include-dir=/etc/pdns/pdns.d
      
    • 创建/etc/pdns/pdns.d/geoip.conf

        launch=geoip
        geoip-database-files=/usr/local/share/GeoIP/GeoLite2-City.mmdb /usr/local/share/GeoIP/GeoLite2-Country.mmdb
        geoip-zones-file=/usr/local/share/zone.yaml
        edns-subnet-processing=true
      
    • 配置geoip-zones /usr/local/share/zone.yaml, refer

      domains:
      - domain: abc.site
        ttl: 30
        records:
          abc.site:
            - soa: ns1.abc.site hostmaster.abc.site 2014090125 7200 3600 1209600 3600
            - ns:
                content: ns1.abc.site
                ttl: 60
            - ns: ns2.abc.site
            - mx: 10 mx.abc.site
            - txt: "your ip is %ip"
          ns1.abc.site:
            - a:
                content: <your_hk_ip>
                ttl: 86400
          ns2.abc.site:
            - a:
                content: <your_shanghai_ip>
                ttl: 86400
          unknown.unknown.geo.abc.site:
            - a: <your_hk_ip>
          unknown.as.geo.abc.site:
            - a: <your_hk_ip>
          cn.as.geo.abc.site:
            - a: <your_shanghai_ip>
        services:
          www.abc.site:
            default: ['%co.%cn.geo.abc.site', 'unknown.%cn.geo.abc.site', 'unknown.unknown.geo.abc.site']
      
  5. systemctl start pdns

在你的hk, shanghai云主机上按照上面的步骤进行pdns部署,之后到namesilo修改站点域名www.abc.site的ns授权器为你自建的ns1.abc.site, ns2.abc.site.

部署traffic server

直接参考这里

静态网站

用nginx在你的hk云主机上部署一个静态网站, 配置server_name www.abc.site.

验证

使用站长工具, 浏览器输入 http://ping.chinaz.com/www.abc.site, 我们就可以看出国内节点输出的响应IP是, 而海外节点输出的响应IP是, 个别节点可能有偏差,因为dns使用的地理库并发100%准确。

这样我们的最初CDN诞生了,它的名字叫Eason.

参考