前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过 Serverless 来动态切换 DNS 解析

通过 Serverless 来动态切换 DNS 解析

原创
作者头像
Mogody
修改2021-10-03 13:06:58
2.6K0
修改2021-10-03 13:06:58
举报
文章被收录于专栏:玩转函数计算玩转函数计算

我们业务是做在线直播和视频点播的,在点播这个业务场景上,为了保证客户端的访问性能,我们接入了腾讯云的 CDN 服务。因为是做视频点播的,所以 CDN 服务费用一直居高不下,而我们的业务又有非常明显的高峰期和平峰期,为了节约 CDN 的成本,于是打算接入轻量云服务器来作为平峰期的流量入口。

轻量云服务器成本很便宜,首单不到 100 元就能买一台 1C2G6M 的机器,而且每个月流量 1000GB,结合最近的活动,可以免费升级到 2C4G6M 的配置,我们目前的配置就是这一档。

1. 轻量服务器转发 COS 请求

我们业务上目前所有的视频文件都是在 COS 服务里面,目前都是使用 CDN 来作为加速服务,但是平峰期其实不用 CDN 问题也不大,轻量的 6M 带宽完全足够了。为了让轻量服务器能代理 COS 的流量,首先要在轻量服务器上安装 Nginx,然后做一个代理转发:

代码语言:javascript
复制
server {
   listen       443;
   server_name  file.example.com;
   ssl on;
   ssl_certificate /etc/nginx/ssl/example.com.fullchain.cer;
   ssl_certificate_key /etc/nginx/ssl/example.com.key;
   error_log  /var/log/nginx/file4.example.com.error_log;
   access_log /var/log/nginx/file4.example.com.access_log;
   location / {
       root /var/www/html;
       proxy_pass  http://example-123456789.cos.ap-shanghai.myqcloud.com;
   }
}

通过一个简单的 Nginx 配置就可以让轻量服务器来转发流量请求流量到 COS 服务上,如果服务器和 COS 是同一个地域,那么走的也是内网的流量,不仅速度快而且不用消耗 COS 的流量。

配置 SSL 证书后可以不接入 CDN 也能支持 HTTPS 访问

2. 配置 COS 支持 CDN 访问

然后还要去 COS 服务配置一个自定义 CDN 加速域名,这个自定义的加速域名必须和轻量服务器访问入口一致,后续通过动态解析来切换流量,配置 COS 支持 CDN 访问非常简单,这里就不再说明。注意配置好了之后,控制台会提示让我们做一个 CNAME的解析,我们先不做这个事情,后面让 Serverless 来处理。

3. 动态解析

以上两件事都做完后,就可以通过函数计算来动态切换 file.example.com 这个域名要解析到轻量云还是 CDN 那边。根据我们的业务特点,我们的高峰期是从周五晚上 18 点开始到周六下午 16 点结束,那么我们就要让这一段时间内的流量走 CDN 那边。

通过 DNSPod 的文档我们可以知道域名解析可以通过 API 来配置,于是我们创建一个自定义的云函数,代码如下:

代码语言:javascript
复制
function main_handler($event, $context) {
    date_default_timezone_set('Asia/Shanghai');
    try {
        $secretId = getenv('DNSPOD_SECRET_ID');
        $secretKey = getenv('DNSPOD_SECRET_KEY');
        $cred = new Credential($secretId, $secretKey);
        $httpProfile = new HttpProfile();
        $httpProfile->setEndpoint("dnspod.tencentcloudapi.com");
        
        $clientProfile = new ClientProfile();
        $clientProfile->setHttpProfile($httpProfile);
        $client = new DnspodClient($cred, "", $clientProfile);

        $req = new ModifyRecordRequest();

        $dateW = date('w');

        $params = [
            "Domain" => "expmale.com",
            "SubDomain" => "file",
            "RecordLine" => "默认",
            "RecordId" => 123456789
        ];

        if ($dateW == 5) {  //周五切换为CDN
            $params['RecordType'] = 'CNAME';
            $params['Value'] = 'file.expmale.com.cdn.dnsv1.com';
        }
        
        if ($dateW == 6) {  //周六切换为云服务器
            $params['RecordType'] = 'A';
            $params['Value'] = '101.35.89.40';
        }

        $req->fromJsonString(json_encode($params));
        $resp = $client->ModifyRecord($req);

        var_dump("请求结果:", $resp->toJsonString());
    } catch(TencentCloudSDKException $e) {
        var_dump("请求出错了...", $e->getMessage());
    }
}

整体的代码很简单,就是构造请求去修改 DNS 的解析记录,根据业务来周五解析到 CDN,周六解析到轻量云。注:其中的 RecordId 是解析记录 ID, 这个要通过接口来获取,可以查看 DNSPod 的文档获取域名的解析记录可以得到,在 DNSPod 的文档

中没有说明,这个算是容易踩坑。

4. 配置触发器

定义好了云函数之后,要配置两个定时类型的触发器,分别在周五的 18 点和周六的 16 点执行,配置触发器也很简单:

配置好了之后一切就完成了。通过轻量云的监控可以看到,平峰期带宽峰值不到 6M,基本稳定在 2-4M 之间:

到了高峰期的话切换到 CDN,看监控的带宽峰值在 14Mbps 左右:

而且每个月 1000G 的流量对我们的业务来说完全够用了,这样我们只需在高峰期付 CDN 的流量费用,平峰期的流量费基本上是 0 成本的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 轻量服务器转发 COS 请求
  • 2. 配置 COS 支持 CDN 访问
  • 3. 动态解析
  • 4. 配置触发器
相关产品与服务
轻量应用服务器
轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门开源软件打包实现一键构建应用,提供极简上云体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档