腾讯云 CDN 踩坑指南


前言

因为个人服务器的成本问题,一般情况下带宽都会开的很低,再者即使是按量计费,每 GB 单价也要八毛。 在看到 CDN 的流量单价只要两毛钱之后就感觉很香,只要 CDN 的命中率达到 30% 以上就可以比直接买带宽/流量要便宜了, 因此开始了漫漫踩坑之旅。

开通 CDN

在腾讯云的官网直接搜索 CDN。

点击立即使用进入控制台,进入之后可能会弹个窗说一堆乱七八糟的注意事项,看看就行。

在左侧选择域名管理,然后点击添加域名。

这里我们需要填写的是三项:

  1. 加速域名,这里填写网页中实际访问的地址,如果你想要整个网站都通过 CDN 代理的话可以填主域名,否则需要单独解析一个专用的子域名。
  2. 加速类型,轻度用户选择小文件即可,基本上足够覆盖我们的使用场景了。
  3. 源站地址,这个表单有点误导性,因为不允许回源地址与加速域名相同,我自然而然的就认为 CDN 是通过这里填写的域名访问我的服务器的。 例如我在填了 cdn.example.com,我在后台收到的请求岂不是 http://cdn.example.com/XXXX ? 实际上不是,这里的回源地址唯一的作用就是通过 DNS 动态解析 IP,后台收到的请求依然是 http://static.example.com/XXXX 。 因此对于轻度用户来说,直接填 IP 地址即可,不需要专门再为了回源而配置一个子域名的解析。 另外,同样的道理,在这里直接填 IP 也不会导致 HTTPS 验证失败。

确认添加,进入下一页。在这里只有一个建议,考虑到轻度用户的更新频率,用户浏览器的缓存时间可以设置长一些,比如 7 天,这样可以节省 CDN 的流量成本。

最后一页,配置 DNS,如果是用的腾讯云的 DNS 解析,可以一键配置,没什么要注意的。

配置服务器

因为我的主页是伪静态的(DjangoBlog 渲染的页面),所以只能创建一个专用子域名用来处理 CDN 的请求。 而 DjangoBlog 本身似乎没有做 CDN 的相关支持,因此只能用跳转的方式来解决问题。

nginx 配置如下:

server {
    listen 80;
    server_name static.example.com;

    location /media/ {
        alias /var/DjangoBlog/DjangoBlog-1.0.0.4/uploads/;
    }

    location /static/ {
        alias /var/DjangoBlog/DjangoBlog-1.0.0.4/collectedstatic/;
    }
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /media/ {
        rewrite ^/(.*)$ https://static.example.com/$1 permanent;
    }

    location /static/ {
        rewrite ^/(.*)$ https://static.example.com/$1 permanent;
    }
}

因为部署好 CDN 之后静态资源就长期不变了,为了避免用户每次都先请求一次 www.example.com 再被重定向到 static.example.com, 所以这里采用了 permanent(301) 永久重定向。

HTTPS

然而还有一个问题,如果主页采用 HTTPS 部署的话,静态资源用 HTTP 可能会被浏览器阻止。因此我们需要为 static.example.com 配置一份 HTTPS 证书。 证书的申请就不必多说了,申请到证书之后,只需要在域名管理页面的 HTTPS 配置页中绑定好自己的证书即可。 而如果你想要更安全一些,即在 CDN 回源的过程中也使用 HTTPS,则需要在 Nginx 中也配置好证书,并在域名管理页面把回源协议切换为 HTTPS。

错误响应

最后一个坑就是 404 响应的缓存了。因为我的网站有很多懒得修的 BUG,因此很多静态资源是 404 的,而 CDN 的默认 404 响应缓存时间只有 10 秒。 这就导致了几乎所有的 404 请求都会穿透到后端,流量倒是不大,只是会一定程度上拖慢页面加载速度。 这就需要在域名管理页面的缓存配置页修改 404 状态码的缓存时间,我设置成了 7 天,即 7 天内 404 请求不会再回源重试。

命中率

这倒不能算是坑,而是小型网站用户量较少导致的问题。众所周知,CDN 有几十个节点,而每个节点在用户第一次访问的时候都是要回源的。 实际上小型网站的真实用户量都不见得有 CDN 节点多,每个用户又分散在不同的地域,结果就是每个用户第一次访问都需要回源。 最终使用下来,我的命中率大概维持在 60%-80% 的样子。无论如何还是省了点流量钱的。

结语

原本以为 CDN 是大型商业网站的专属,在实际体验之后发现即使是小网站,使用 CDN 也可以大大提升用户体验并且降低成本。 虽然坑也有不少,但在熟悉操作之后几分钟就可以完成全部的 CDN 配置工作。