白嫖 Backblaze 对象存储打造图床

图床一直是个人博客一个很头痛的问题,第三方的图床我一直不敢用,怕哪一天就宣布停止运营了然后让用户迁移数据。有很多博客也会采用 Github 仓库存储图片然后再利用 jsdelivr 作为 CDN 加速访问。但是 jsdelivr 最近更新的使用政策中规定禁止使用 jsdelivr 加速图片。现在只是有这个声明,实际上可能不会管,但是以后的事可能就说不好了,万一哪天就直接限制图片访问次数就直接 GG 了。经过一番探索,发现了国外的一个很棒的云存储 Backblaze 可以满足作为个人博客的图床需求,本文主要讲讲如何利用 Backblaze 的对象存储和 Cloudflare 免费的 CDN 打造一个私人图床。

1. BackBlaze 简介

BackBlaze 成立于2017年,是一家云存储和个人数据备份公司,其有 4 个数据中心,其中 3 个在美国,1 个在欧洲。BackBlaze 提供对象存储服务,对于个人博客来说,有着以下优点:

  • 免备案:这个优点是最大的,国内的备案真的太麻烦了。
  • 费用低:BackBlaze 的每 GB 的存储费用是 $0.005,每 GB 的下行费用是 $0.01,根据官网的对比,要比亚马逊、谷歌云等便宜得多。而且,BackBlaze 还白送 10 GB 存储空间!
  • 流量免费:BackBlaze 和 Cloudflare 同属一个带宽联盟,因为可以利用 Cloudflare 的 CDN 免费分发,免去传输费用。

我们到底要怎么样白嫖出一个图床呢?下面我们先进行一下费用分析,一般对象存储的费用可以分为3个部分:

  • 存储费用:BackBlaze 免费送 10 GB 空间,超过部分是 $0.005/GB。
  • 请求次数:BackBlaze 免费送 2500 次请求每天,超过部分是 $0.004 每 1万次请求。
  • 下行流量:BackBlaze 和 Cloudflare 之间传输数据时不算流量费用的,而 Cloudflare 的 CDN 又是免费的,只要小于 100 M的文件都可以通过 Cloudflare 的 CDN 免费分发。

2. 将 BackBlaze 打造为个人图床

下面开始一步一步讲述一下怎么做:

2.1 创建存储桶

先创建一个存储桶,注意将存储桶设置为可以公开访问的。

然后再 bucket setting 里面设置一下缓存参数为 {"cache-control":"max-age=2592000"},这里我们将最大缓存时间设置为1个月。这样设置好之后 Cloudflare 才能存储 Backblaze 上的文件。

之后进入存储桶详情页,随便上传一个文件,点击文件查看其下载链接:

我们把其域名f000.backblazeb2.com记下来,后面会用上。

2.2 使用 Cloudflare CDN 分发内容

在 Cloudflare 的 DNS 管理面板上添加一个 CNAME 记录,把我们的一个二级域名指向 Backblaze 的域名,也就是上面那个f000.backblazeb2.com。注意将自动代理开发,这样 Cloudflare 才会缓存文件。这个例子中我们将backblazeb2.chenyaofo.com指向了f000.backblazeb2.com

单单只是设置域名别名图片的 url 比较长,还需要包含存储桶的名字。最后我们想搞一个这样的 url image.chenyaofo.com/xx.jpg,这样比较好用,并且即使将来需要迁移图床到其他解决方案也好搞。为了实现这样的访问 url,我们可以利用 Cloudflare 提供的页面转发功能。我们再添加一个 DNS 的 A 记录,将 image.chenyaofo.com 指向 8.8.8.8(其实这里随便填一个ip地址都可以)并设置自动代理转发。

下面转到页面规则,添加两个规则。第1个规则时设置页面缓存的(如下图所示),我们将backblazeb2.chenyaofo.com设置为:缓存级别为缓存所有,边缘缓存的过期时间时一个月,游览器的缓存时间为1天。

然后我们设置一个页面转发规则,将image.chenyaofo.com/*的内容通过 302 临时重定向到https://backblazeb2.chenyaofo.com/file/my-image-host/$1(其中$1就是指代*的内容)。

2.3 使用 ShareX 截图上传

图床搭建好之后,我们可以使用 ShareX 来截图上传。首先我们在 Backblaze 上创建一个key:

点击确定之后会生成key:

再在 ShareX 的 [目标] -> [上传目标设置] -> [BackBlaze B2] 中,将上面的 key id 和 密码填进去,并且填写 bucket 的名称,以及 url 的前缀:

至此,我们的图床工作流就已经准备完成了!

2.4 检查图床是否成功

通过游览器随便打开一张图床里面的图片,打开游览器的开发者模式。如果在请求头里面看到cf-cache-status: HIT则说明已经成功了,图片是由 Cloudflare 的 CDN 进行分发的。如果看到cf-cache-status: BYPASS,那就要检查一下是否给 Backblaze 的存储桶设置缓存头,其次再检查下有没有在 Cloudflare 的 DNS 中设置自动代理了。

3. 拓展用法

其实从上面的描述来看,这套方法不仅能做图床,其实可以白嫖 Backblaze 和 Cloudflare 分发任何小于 100 M的文件。你只需要出存储费用,这个存储费用真的算是很便宜了,即使你存储了 1 TB 的文件,也只需要 $5。缺点就是 Cloudflare 只能缓存 100 M以下的,超过 100 M 的文件会直接通过 ByPass 模式回源;另外 Cloudflare 在国内的延迟有点高,带宽倒是还可以。