流量费砍半,顺手把盗链拦住
OBS + CDN 静态站点加速实战:流量费砍半,顺手把盗链拦住
上周把一个内部文档站从"OBS 直出"迁到了"OBS + CDN",整个过程大约 40 分钟,月流量按 100GB 估算,账单从 50 元出头降到 27 元左右,顺带把防盗链和 HTTPS 一起收口了。这篇把关键步骤、配置项和踩过的坑一次讲清楚,照着做基本能复现。
一、只放 OBS 的三个问题
静态站点直接扔进 OBS 桶确实能访问,但很快会遇到三件事:
- 源站单地域。OBS 桶只在一个区域,跨地域访问 RTT 明显变高,首屏 2 秒以上很常见。
- 流量贵。OBS 公网流出按量计费,访问量一上来账单增长很快。
- 资源裸奔。桶设成公共读之后,别人把图片、JS 直接引到自己的站上,流量仍然算你的。
CDN 解决的正是这三点:用户就近接入边缘节点,回源次数大幅下降;流量单价更低;防盗链、HTTPS、缓存策略全部收口在 CDN 层,OBS 退回成只读源站。
二、整体链路
访问链路:
用户 → CDN 边缘节点(缓存 / 防盗链 / HTTPS)→ 回源 → OBS 静态网站托管
发版链路:
本地构建 → obsutil 增量上传 → CDN 刷新首页
分工很清晰:OBS 负责存,CDN 负责送。
三、五步落地
第 1 步:建桶并开启静态网站托管
- 区域选离主要用户近的,例如华北-北京四。
- 桶名全局唯一。静态网站托管要求桶策略允许公共读,所以权限先设为公共读;如果后面启用 CDN 私有桶回源,再收紧为私有。
- 进入"基础配置 → 静态网站托管",默认首页填
index.html,默认错误页填404.html。 - 记下静态网站托管域名,格式是
obs-website域名,例如:
my-docs-site.obs-website.cn-north-4.myhuaweicloud.com
这个域名和普通桶域名不是一回事。静态托管域名才会在访问根路径时自动返回 index.html,后面 CDN 源站要指向它,别用普通桶域名。
第 2 步:obsutil 增量上传
obsutil config -i=<AK> -k=<SK> -e=obs.cn-north-4.myhuaweicloud.com
obsutil cp ./dist obs://my-docs-site/ -r -f -u
-r 递归,-f 覆盖,-u 只上传新增或变更的对象。几百个文件的站点通常几秒就能传完,比整站全量上传省事很多。
AK/SK 建议用 IAM 子账号,只授予这个桶的读写权限,不要图省事用主账号密钥。密钥写进脚本时,至少要放在环境变量里,别提交到代码仓库。
第 3 步:添加 CDN 加速域名
- 业务类型选"网站加速",静态资源走这一档即可。
- 源站类型选"OBS 桶",选中刚建的桶;如果控制台要求填源站域名,填静态网站托管域名,不要填普通桶域名。
- 加速域名必须已完成备案,否则接不进来。
- 创建完成后,把控制台给出的 CNAME 值添加到 DNS 服务商,等解析生效。
第 4 步:缓存规则与 HTTPS
缓存是静态站点加速收益的主要来源,规则建议按文件类型拆开:
| 资源类型 | 缓存时间 | 说明 |
|---|---|---|
index.html |
0~60 秒 | 发版要即时生效,宁可回源 |
| JS / CSS / 图片 / 字体 | 30 天 | 文件名带 hash,内容变则 URL 变 |
| 接口类 JSON | 不缓存 | 避免脏数据 |
同时开启智能压缩和 Range 回源,前者减小传输体积,后者让大文件支持断点续传。
HTTPS 在 CDN 侧上传证书后开启,并打开"强制 HTTPS"。否则页面是 HTTPS、资源还是 HTTP,浏览器会直接拦截。
第 5 步:防盗链三重防护
第一层,Referer 白名单。 只放行自己的域名和本地调试地址。是否允许空 Referer 要看场景:浏览器直接打开、部分 App 内嵌页面不会带 Referer,一刀切拒绝会误伤正常用户。
第二层,URL 鉴权。 对下载、付费类资源使用带时间戳的签名 URL,由服务端用密钥生成,过期自动失效。密钥只放在服务端,绝不能出现在前端代码里。
第三层,源站收口。 这是最有效的一层:CDN 开启私有桶回源并完成授权,OBS 桶设为私有,桶不再公共读。这样即使有人拿到源站域名,也读不到对象,所有流量只能走 CDN。需要注意的是,私有桶回源时静态托管的默认首页不一定自动生效,切换后要验证根路径是否仍返回 index.html,必要时在 CDN 侧配置默认首页。
如果当前环境不支持私有桶回源,退一步也要做 Referer 白名单加 URL 鉴权。不要用"CDN 回源 IP 白名单"硬扛,回源 IP 并不固定,维护成本很高。
四、费用对比
按每月 100GB 流量、2GB 存储、100 万次 HTTPS 请求、缓存命中率 90%(回源 10GB)估算,单价取官网按需价的量级,实际以价格计算器为准:
| 项目 | OBS 直出 | OBS + CDN |
|---|---|---|
| 存储 2GB | 0.2 元 | 0.2 元 |
| 公网流量 100GB | 50 元 | — |
| CDN 流量 100GB | — | 20 元 |
| 回源流量 10GB | — | 1.5 元 |
| HTTPS 请求 100 万次 | — | 5 元 |
| 合计 | 约 50.2 元 | 约 26.7 元 |
节省接近一半。流量越大、命中率越高,差距越明显。CDN 不是"多套一层",在静态站点上它同时是加速层和计费优化层。
五、踩坑清单
| 现象 | 原因 | 处理 |
|---|---|---|
| 访问根路径 404 | CDN 源站填了普通桶域名 | 改为静态网站托管域名 |
| 回源 403 | 桶未开公共读,或私有桶未授权 CDN 回源 | 调整桶策略或开启私有桶回源 |
| 发版后页面还是旧的 | index.html 被长缓存 |
HTML 单独短缓存 + 发版刷新 |
| 自定义域名接不进 CDN | 域名未备案 | 先完成备案 |
| HTTPS 页面资源被拦截 | 资源仍是 HTTP | 全站 HTTPS + 强制跳转 |
| 字体加载跨域失败 | 桶未配置 CORS | 允许源站域名 GET/HEAD |
六、小结
这套方案没有复杂组件,核心就三个动作:用静态网站托管域名做源站、HTML 短缓存而静态资源长缓存、桶权限收紧配合 CDN 回源鉴权。做完之后,发版是一条 obsutil 命令,账单砍掉近一半,盗链也基本被挡住。
如果你的站点访问量还很小,先上 CDN 可能感知不明显;但一旦有推广、被聚合站收录,或者开始出现异常流量,越早把源站收口,后面越省心。
- 点赞
- 收藏
- 关注作者
评论(0)