在如今的网络时代,个人博客的网络存储俨然成为了站长必须思考的问题。很多人选择使用第三方图床来替代本地图片,不过这也多了一份风险。也有人选择使用由阿里云、腾讯云提供的云存储服务来存储图片,不过费用问题在将来会成为一个头疼的事。今日这篇文章,且听小伍为各位娓娓道来其中的选择之处。
小伍的图床简史
在非常开始,我自用的图床为阿里云 oss+CloudFlare。通过宽带同盟的作用,可以获得免回源流量,因此应用 oss 的老本为请求数 + 存储价格。不过从长远来看,oss 的 5g 不收费存储其实并不算多,因为这 5g 并不是一个存储桶,而是一切存储桶。而请求数则是 0.01 / 万,正常环境下这个基本可以纰漏,因为理论上来讲 CloudFlare 缓存后,则不会产生此价格。要紧的则是存储价格(相较于腾讯云老用户还是相对贵的)。
接下来我便过渡到了 CloudFlare+B2 存储的,B2 一样是宽带同盟的成员,因此流向 CloudFlare 的流量也可以免掉。B2 提供了 10G 不收费存储和若干不收费请求 / 天。不过 B2 的 S3 协议并不在 lsky pro 图床以及 Taio 图床工具的支持范围,因此应用此计划只能通过 PicGo 进行上传,手机则暂时不用考虑了。非常后想到了腾讯云另有老用户赠送的资源包,那为什么不用腾讯云呢?
因此非常终选定了腾讯云,因为本身就有腾讯云服务器,因此通过 lsky pro 上传则是通过内网进行的传输。而 CDN 回源时我并无直接让其回源 COS 存储桶,而是回源服务器 NGINX 反代 COS 存储桶进行回源。这样就不会产生 COS 侧的回源流量和外网流出流量。本着能白嫖就白嫖的思路,我一样对其开启了数据万象功能来将图片转为 webp 格式,来削减 CDN 流量的输出。
费用对比
以下费用全部建立源地址不被泄露的情况下,例如 OSS、COS 私有。
| 对比 | OSS | COS | B2 |
|---|---|---|---|
| 存储空间 | 5g (免费) | 25g(免费) | 10G |
| 上传流量 | 不计费 | 内网不计费,外网计费 | 不计费 |
| 外网下行 | 不消耗 | 无 | 1G / 天 |
| 请求次数 | 消耗 | 消耗 | 2500 / 天 / 上传下载 |
| CDN 回源 | 无 | 内网(免费) | 无 |
| 数据取回 | 外网(花钱) | 内网(免费) | / |
| 跨地域复制 | 无 | 需要 | 无 |
| 白嫖流量包 | 无 | 老用户才有 | 无 |
以上数据建立在我的个人主观上,例如:我领有腾讯云服务器,可以走腾讯云 COS 的内网,而没有阿里云服务器,不能走 OSS 内网。该数据仅供参考,大概与官方并不是非常精确。
CloudFlare 回源 Backblaze B2
此方案我个人认为是最保险的方案,因为只要不绑卡,即使额度被刷完,也不会扣钱。况且免费额度基本够个人用户使用。
- 登录 b2_buckets 网站创建一个存储桶这里的权限选择公众 (public),并且桶的名称是全局唯一且不能泄露的,因为一旦泄露那么恶意访问者就可以刷光你的额度了。
- 上传一个文件,获取地址该资源的地址我们需要使用的是 “友好 URL”,例如:
https://f004.backblazeb2.com/file/xxxxxxxxx/79620324_p0.png - CF 端进行 DNS 解析和规则重写添加 DNS,请务必打开代理状态进行 URL 规则重写,重写的表达式
concat("/file/[youbucket]",http.request.uri.path)。请将 [youbucket] 替换为你的存储桶名称 - 解析来就可以通过 CF 访问资源了例如:https://b21.acs.pw/79620324_p0.png上边 URL 规则实际上是把
https://b21.acs.pw/79620324_p0.png请求替换为https://b21.acs.pw/file/[youbucket]/79620324_p0.png了。通过路径理论上不会泄露 bucket 名称。
CloudFlare回源OSS
- 开通 OSS众所周知,宽带联盟覆盖区域不包括中国大陆,因此你需要重新开通一个海外地区的存储桶。关于地区的选择
- 如果你目前有外海服务器,那么建议你开通同区域 OSS。(使用该海外服务器上传资源)
- 如果你没有海外服务器,那么建议你直接香港地区。因为国内直连香港地区还算是比较稳定的
- 权限设置将权限设置为私有,最大程度上避免被恶意盗刷。(如果你富可敌国,那么可以选择公开)接下来设置 Bucket 授权策略来允许 CF 的节点 IP 访问
173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,172.64.0.0/13,131.0.72.0/22,104.16.0.0/13,104.24.0.0/14- 添加域名解析即可
CloudFlare回源COS
COS 这里的方案主要借助于数据万象来使 CF 进行内网传输,因为 CF 回源 COS 免回源流量需要达到 100TB 的存储。
此文中介绍的方案可能稍许复杂,但一切都是为了把成本降到最低
本篇方案实现基础:
- 【必须】需要有腾讯云服务器(国内)
- 【非必须】最好有部分资源包,避免扣费
- 【非必须】由于同时兼顾国内国外,因此国内 CDN 也是必要的(不一定非要是腾讯家的)
- 【非必须】既然使用了国内 CDN,则备案域名就是必须的
- 开通国内存储桶,与你在腾讯云服务器在同地区(为了实现内网传输)。例如我的轻量是北京地区,那么则开通北京地区的 COS。同样的设置权限为私有
- 设置权限设置存储桶访问权限为私有读写,并设置 Policy 权限设置添加自己服务器内网 IP
- 创建国外存储桶,建议放在美国地区(不是迪拜和大陆就可)因为距离 CF 回源比较近。
- 设置国外存储桶的权限并添加自定义 CDN 域名
173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,172.64.0.0/13,131.0.72.0/22,104.16.0.0/13,104.24.0.0/14 - 设置存储桶访问权限为私有读写,并设置 Policy 权限设置添加 CloudFlare 的 IP添加在 CF 侧的域名
- 开启国内存储桶容灾备份,备份到国外存储桶中
- 在数据万象中对国内存储桶添加如下样式名。这里我设置的分隔符为
/,样式名称为webp - 设置内网服务器反向代理这部分需要根据你服务器的实际情况进行跳转,这里给出我的示例。配置中使用了数据万象处理,例如如下:
- 免费图片额度 10T,理论上不会用完的(CDN 需永久缓存)
- 减小图片大小,在一定程度上可以减小 CDN 流量开销
server{
listen 80;
server_name file2.antmoe.com;
location /ap-cos-blog {
allow 127.0.0.1;
deny all;
# 腾讯云的DNS解析 请根据实际情况获取
resolver 183.60.82.98 183.60.83.19;
proxy_http_version 1.1;
proxy_pass https://xxxx.cos.ap-beijing.myqcloud.com/;
}
location ~ /cos-blog/(.*) {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-FOR $proxy_add_x_forwarded_for;
# 不传递请求头,避免使用腾讯CDN产生回源流量
proxy_pass_request_headers off;
proxy_http_version 1.1;
# 末尾的 /webp 需要根据你上边设置的填写
proxy_pass http://localhost:8080/ap-cos-blog/$1/webp;
}
}- 关于
resolver的值,如果填写错误,那么会将你的地址解析到公网,从而产生外网流出费用。因此你需要在你服务器中查看该 DNS。 vi /etc/resolv.conf- 解析来正常设置 CDN 回源服务器即可(国内地区)
需要注意的是:国内 CDN 即使关闭 CDN 后,返回 404 状态码也是收费流量费用的。因此当你受到攻击时,请务必删除 CDN。
建议 CDN 处开启永久缓存,因为作为图床,理论上是不会发生更改的。设置 Cloudflare添加 DNS 记录,并设置 url 规则重写。
由于我的主域名并不在 CF,因此进行分地域解析时借助了 vercel 的 301 重定向。
当然如果你有较好的方案,可以邮件或评论告诉我
vercel 只需要部署一个 vercel.json 即可。内容参考:https://github.com/kkfive/cf-redirect/blob/master/vercel.json
关于上传
我目前使用的几款上传工具对于上述三种方案的支持情况
| 上传 | Backblaze B2 | OSS | COS |
|---|---|---|---|
| PicGo | 需借助插件 picgo-plugin-s3 | 支持 | 支持 |
| Lsky Pro | 暂不支持 | 支持 | 支持 |
| Taio | 需借助 Image-Uploader 动作 | 需借助 Image-Uploader 动作 | 需借助 Image-Uploader 动作 |
| 快捷指令 | 暂无比较好的方案 | 可与 lsky pro 接口对接 | 可与 lsky pro 接口对接 |
COS 费用测试
此测试仅供参考,请在正式投入生产环境时反复测试消耗流量情况。避免产生高额费用
初始数据
此数据为今日统计数据,确保无资源访问 2 小时。以一张 1M 左右的图片为例进行测试。图片资源原始文件:
可以看到都已经是变成了 webp 格式。
第一次数据记录
说实话挺意外的,数据万象侧国外存储桶发生了外网流出流量,但看到访问国内域名时使用了代理,可能由于 DNS 原因导致(因为之前测试的方法会产生外网流量),因此此次结果并不清楚是什么原因仍需再次测试
第二次数据记录
一开始外网流出还在涨,调整了数据万象处理图片的姿势后,内网流量才开始上涨。怀疑这是个 bug
第三次数据记录
第四次数据记录(重新记录)
这次重新上传一张图片进行测试,并且只记录数据万象侧的数据统计(由上图可见,COS 侧不会消耗流量)



评论 (0)