今天早上 7:37,手机收到一条短信。

您的 CDN 账号余额不足 1 元,预计可用时间小于 3 天,请及时充值。

CDN余额告警短信

第一反应是——不对啊,我这博客一个月也就几块钱的流量,怎么就快没钱了。

我的博客 coderlog.net 托管在自己的服务器上,静态资源走 CDN 加速。平时每天几百 KB 的流量,月账单稳定在十来块钱。余额怎么也不该见底。

打开 CDN 控制台一看,好家伙。

CDN服务流量排行

8.188 GB,1376 次请求

服务流量排行里,我的博客域名赫然排在第一,单日流量 8.188 GB,峰值带宽 4.677 Mbps。

一个日访几百的个人博客,一天跑 8 个 G?

直觉告诉我,不是被刷了就是有哪个大文件在反复加载。

点进日志分析,按「热门文件」排序,真相大白——

CDN日志分析-热门文件排行

排名 文件 请求数 流量
1 GettingStarted-cropped-oneLoop.gif 1,229 8.176 GB
2 tctip-1.0.3.min.js 71 4.669 MB
3 SeekHarness-Setup.exe 2 4.008 MB
4 .jpg 图片 29 2.288 MB

第一名的 GIF,一个文件,吃掉了 99.9% 的流量。

1229 次请求,8.176 GB,平均每次请求约 6.8 MB。这是一个放在网站头部的循环播放 GIF,每个访客打开页面就会完整加载一遍。

一天扣两块八,一个月就是八十五

翻了一下最近十天的账单:

最近十天CDN账单

日期 账单金额
09-27 2.80 元
09-26 1.99 元
09-25 2.71 元
09-24 2.60 元
09-23 2.75 元
09-22 2.61 元
09-21 2.80 元
09-20 2.84 元
09-19 2.89 元
09-18 2.61 元

日均 2.66 元,一个月就是 80 块。对于一个月访几万的小博客来说,这完全是冤枉钱。

删掉 GIF,带宽瞬间归零

定位到问题之后,处理方式很简单——把这张 GIF 从网站头部撤掉。

效果立竿见影。从带宽监控图上可以清楚看到,9:15 左右删掉图片后,带宽从之前持续在 200-700 Kbps 之间波动,直接掉到了接近零线,之后一整天都平平的。

删掉GIF后的带宽监控

那张 GIF 叫 GettingStarted-cropped-oneLoop.gif,是一段教程演示的循环动画。当时觉得放在首页顶部挺好看,每个访客进来都能看到动态效果。

好看是好看,但代价是每次请求 6.8 MB。

几个教训

第一,GIF 是体积杀手。

同样的动画内容,如果转成 MP4 或 WebM,体积可以压到原来的 1/10 到 1/20。6.8 MB 的 GIF 换成 WebM 大概 300-500 KB,流量直接降一个数量级。

如果一定要放动画,用 <video autoplay loop muted playsinline> 替代 <img>,体验几乎一样,流量省 90% 以上。

第二,CDN 不会帮你省流量,它只会帮你加速花钱。

CDN 的作用是把内容缓存到离用户更近的节点,提升访问速度。但如果你有一个大文件被反复请求,CDN 反而会让它加载得更快——更快地消耗你的流量。

没有任何 CDN 会主动告诉你「这个文件吃了很多流量,建议你处理一下」。这得自己看。

第三,定期看一眼流量排行。

很多时候流量异常不是被攻击,就是某个大文件在默默烧钱。日志分析里的「热门文件」排序是最快的排查入口——按流量降序,第一名如果是某个静态文件且流量占比超过 50%,基本就是它了。

第四,余额告警要设高一点。

我之前把余额告警设在了 1 元。这次如果不是恰好看到短信,再过两天 CDN 就停了,网站静态资源全部 404。建议告警阈值设在月均消费的 3-5 倍,给自己留足反应时间。

最后

这次排查总共花了不到十分钟——看短信、打开控制台、查流量排行、看热门文件日志、定位到 GIF、删掉。

但如果不排查,一个月 80 块的冤枉账单就会一直扣下去,直到余额耗尽、CDN 停服、网站静态资源全部不可用。

个人站长的日常,大概就是这样——写代码是副业,运维才是主线任务。