我们业务是做在线直播和视频点播的,在点播这个业务场景上,为了保证客户端的访问性能,我们接入了腾讯云的 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.myzijiebao.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 成本的。