https://www.antmoe.com/posts/3f5daa8e/
 
这篇文章已经发表了 35 天了,其中某些内容可能已经过时。

 个人自用图床简史

在最开始,我自用的图床为阿里云 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 (免费) 50g(免费) 10G
上传流量 不计费 内网不计费,外网计费 不计费
外网下行 不消耗 1G / 天
请求次数 消耗 消耗 2500 / 天 / 上传下载
CDN 回源 内网(免费)
数据取回 外网(花钱) 内网(免费) /
跨地域复制 需要
白嫖流量包 老用户才有 (需手动领取)

以上数据建立在我的个人主观上,

例如:我拥有腾讯云服务器,可以走腾讯云 COS 的内网,而没有阿里云服务器,不能走 OSS 内网。

该数据仅供参考,可能与官方并不是很准确。

 CloudFlare 回源 Backblaze B2

此方案我个人认为是最保险的方案,因为只要不绑卡,即使额度被刷完,也不会扣钱。况且免费额度基本够个人用户使用。

  1. 登录 b2_buckets 网站创建一个存储桶

    这里的权限选择公众 (public),并且桶的名称是全局唯一且不能泄露的,因为一旦泄露那么恶意访问者就可以刷光你的额度了。

    image-20220515161713525

  2. 上传一个文件,获取地址该资源的地址

    我们需要使用的是 “友好 URL”,例如:https://f004.backblazeb2.com/file/xxxxxxxxx/79620324_p0.png

    image-20220515162112761

  3. CF 端进行 DNS 解析和规则重写

    添加 DNS,请务必打开代理状态

    DNS设置

    进行 URL 规则重写,重写的表达式 concat("/file/[youbucket]",http.request.uri.path)请将 [youbucket] 替换为你的存储桶名称

    image-20220515162545175

  4. 解析来就可以通过 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

此方案风险性极高,操作不当即有可能赔套房子,因此请反复测试,确认无问题后在投入生产使用。

此方案风险性极高,操作不当即有可能赔套房子,因此请反复测试,确认无问题后在投入生产使用。

此方案风险性极高,操作不当即有可能赔套房子,因此请反复测试,确认无问题后在投入生产使用。

  1. 开通 OSS

    众所周知,宽带联盟覆盖区域不包括中国大陆,因此你需要重新开通一个海外地区的存储桶。

    关于地区的选择

    • 如果你目前有外海服务器,那么建议你开通同区域 OSS。(使用该海外服务器上传资源)
    • 如果你没有海外服务器,那么建议你直接香港地区。因为国内直连香港地区还算是比较稳定的
  2. 权限设置

    将权限设置为私有,最大程度上避免被恶意盗刷。(如果你富可敌国,那么可以选择公开)

    image-20220515163707700

    接下来设置 Bucket 授权策略来允许 CF 的节点 IP 访问

    CODE
     
    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
     

    image-20220515163946703

  3. 添加域名解析即可

    1. OSS 处添加域名
    2. CF 处 DNS 记录即可

    image-20220515164249603

 CloudFlare 回源 COS

此方案风险性极高,操作不当即有可能赔套房子,因此请反复测试,确认无问题后在投入生产使用。

此方案风险性极高,操作不当即有可能赔套房子,因此请反复测试,确认无问题后在投入生产使用。

此方案风险性极高,操作不当即有可能赔套房子,因此请反复测试,确认无问题后在投入生产使用。

博主测试,CloudFlare 回源海外存储桶时虽然大部分流量可走内网(不计费),但还是会产生部分外网流量,因此不再建议使用跨区域复制和国内外分流。

而是建议所有流量均从服务器流出,这样确保所有流量均走内网。

COS 这里的方案主要借助于数据万象来使 CF 进行内网传输,因为 CF 回源 COS 免回源流量需要达到 100TB 的存储。

此文中介绍的方案可能稍许复杂,但一切都是为了把成本降到最低

本篇方案实现基础:

  • 【必须】需要有腾讯云服务器(国内)
  • 【非必须】最好有部分资源包,避免扣费
  • 【非必须】由于同时兼顾国内国外,因此国内 CDN 也是必要的(不一定非要是腾讯家的)
  • 【非必须】既然使用了国内 CDN,则备案域名就是必须的

大致流程图如下

图床cos方案

  1. 开通国内存储桶,与你在腾讯云服务器在同地区(为了实现内网传输)。

    例如我的轻量是北京地区,那么则开通北京地区的 COS。同样的设置权限为私有

  2. 设置权限

    设置存储桶访问权限私有读写,并设置 Policy 权限设置添加自己服务器内网 IP

    image-20220515170653961

  3. 创建国外存储桶,建议放在美国地区(不是迪拜和大陆就可)因为距离 CF 回源比较近。

  4. 设置国外存储桶的权限并添加自定义 CDN 域名

    CODE
     
    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

    image-20220515171252456

    添加在 CF 侧的域名

    image-20220515173714764

  5. 开启国内存储桶容灾备份,备份到国外存储桶中

    image-20220515171438391

  6. 在数据万象中对国内存储桶添加如下样式名。

    这里我设置的分隔符为 /,样式名称为 webp

    image-20220515173005787

  7. 设置内网服务器反向代理

    这部分需要根据你服务器的实际情况进行跳转,这里给出我的示例。

    配置中使用了数据万象处理,例如如下:

    • 免费图片额度 10T,理论上不会用完的(CDN 需永久缓存)
    • 减小图片大小,在一定程度上可以减小 CDN 流量开销
    NGINX
     
     
    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。

    BASH
     
    vi /etc/resolv.conf
     
  8. 解析来正常设置 CDN 回源服务器即可(国内地区)

    需要注意的是:国内 CDN 即使关闭 CDN 后,返回 404 状态码也是收费流量费用的。因此当你受到攻击时,请务必删除 CDN。

    建议 CDN 处开启永久缓存,因为作为图床,理论上是不会发生更改的。

  9. 设置 Cloudflare

    添加 DNS 记录,并设置 url 规则重写

    image-20220515221854034

    ?imageMogr2/format/webp/rquality/75

  10. 设置 DNS

    由于我的主域名并不在 CF,因此进行分地域解析时借助了 vercel 的 301 重定向。

    当然如果你有较好的方案,可以邮件或评论告诉我

    vercel 只需要部署一个 vercel.json 即可。内容参考:https://github.com/kkfive/cf-redirect/blob/master/vercel.json

    image-20220515175221495

 关于上传

我目前使用的几款上传工具对于上述三种方案的支持情况

  Backblaze B2 OSS COS
PicGo 需借助插件 picgo-plugin-s3 支持 支持
Lsky Pro 暂不支持 支持 支持
Taio 需借助 Image-Uploader 动作 需借助 Image-Uploader 动作 需借助 Image-Uploader 动作
快捷指令 暂无比较好的方案 可与 lsky pro 接口对接 可与 lsky pro 接口对接

 COS 费用测试

b2 方案不存在费用。oss 方案经过测试应该只需要付请求次数的费用即可。而 cos 费用组成较为复杂。

此测试仅供参考,请在正式投入生产环境时反复测试消耗流量情况。避免产生高额费用

 初始数据

此数据为今日统计数据,确保无资源访问 2 小时。以一张 1M 左右的图片为例进行测试。图片资源原始文件:

国内国外图片地址

国内:https://file2.antmoe.com/image/2/2022/05/15/6280daa10ed8e.jpg

国外:https://file2.acs.pw/image/2/2022/05/15/6280daa10ed8e.jpg

可以看到都已经是变成了 webp 格式。

image-20220515185107508

image-20220515185124339

 第一次数据记录

说实话挺意外的,数据万象侧国外存储桶发生了外网流出流量,但看到访问国内域名时使用了代理,可能由于 DNS 原因导致(因为之前测试的方法会产生外网流量),因此此次结果并不清楚是什么原因仍需再次测试

image-20220515193641685

 第二次数据记录

一开始外网流出还在涨,调整了数据万象处理图片的姿势后,内网流量才开始上涨。怀疑这是个 bug

image-20220515221626862

 第三次数据记录

2022-05-16 09:52 查看昨日数据万象使用统计

image-20220516095603899

image-20220516095841568

 第四次数据记录(重新记录)

这次重新上传一张图片进行测试,并且只记录数据万象侧的数据统计(由上图可见,COS 侧不会消耗流量)

image-20220516134231617