01_转载-图床搭建 Backblaze B2 + Cloudflare CDN

:点击此处或下方 以展开或折叠目录

相关链接

  1. BlazeB2 - 基于 BackBlazeB2 和 Cloudflare 的图床工具(未使用)

转载文章

  1. Backblaze B2 + Cloudflare CDN可自定义域名的10G高速免费外链图床

  2. 使用Backblaze B2 + Cloudflare CDN + PicGo实现可自定义域名的10G免费图床解决方案

  3. 使用Backblaze B2和Cloudflare作为免费图床

感谢 ReCreyed 的分享。以下内容全文摘自上面 3 篇文章

文章1:Backblaze B2 + Cloudflare CDN

本博客其他文章使用的都是github图床,无意中发现了B2+CF+ShareX的自建图床方案,而且还可以自定义域名,所以就有了这篇文章,本文所有图片全部来自这种方法的图床。

图床指的就是储存图片的服务器,网站管理员为了方便维护和管理,会将图片存放在专门的服务器集群里,通常还会在外层套层 CDN 做分发。市面上的公开图床很多,例如 imgur、sm.ms、imgbox 等等,这些图床都开放了 API 方便开发者调用。不过由于运营成本问题,也有不少图床相继倒闭或者转入收费。

怎么自建图床?如果是有VPS主机服务器,安装个Chevereto 开源图床网站程序即可。但这是VPS单纯用来做图床给博客外链图片用,有点浪费且不易长久。图片存储最好是放在大公司的云服务平台上, Backblaze B2 是一个云存储解决方案,类似于Amazon AWS S3, 但是价格稍微便宜一些. Backblaze的云存储每个注册用户拥有10G免费空间以及每天1G的下载流量,上传流量不限。超过免费额度后的价格以及与其他几家主流商家的对比见下图。

在backblaze存储1T的内容也仅需$5/月,不过流量费还是比较贵的 ,上传流量不限。 由于 Bandwidth Alliance(带宽联盟),Backblaze 到 Cloudflare 之间的出口是完全免费的, 所以Backblaze B2可以配合cloudflare CDN来使用达到无限免费下载流量。

Backblaze宣布与Cloudflare合作,免除掉Backblaze到Cloudflare的流量费用。

因此我们得到如下网盘/图床产品:

  • 10G存储空间免费, 全球最可靠的云存储服务

  • 上行免费

  • 下行免费

  • 可自定义域名

  • 全球最强CDN加速

搭建自定义域名图床教程开始

首先,你需要有一个域名,选择一个子域名作为图床的域名。 关于图床的二级域名命名,一般有以下几种:

  • img

  • images

  • assets

  • static (不仅存放图片,还有存放 css、js)

然后,创建 Backblaze B2 Bucket(存储桶) 。

Backblaze’s B2 storage 注册一个账号,注册好了后,在后台面板选择 “Buckets”(存储桶),然后点击 “Create a Bucket”,创建一个存储桶。选Public,以便所有人可访问。

然后,回到 “Buckets(存储桶)” , 在你刚刚创建的存储桶上,点击 “Upload/Download(上传/下载)”. 上传一个临时的测试文件到存储桶中,然后在你刚上传的文件处,点击 “i(information,信息)”. 这是为了获取下一步需要的信息,你的存储桶处于哪台服务器上.

在上面的截图中,可以看到,我的文件是放在 https://f000.backblazeb2.com/ – 记住这个域名
最后,获取到地址之后就登录cloudflare,给你的域名添加一个子域名,并新增一条cname记录,指向文件地址中的域名,例如将img.coca.cc通过cname到f000.backblazeb2.com,效果便是https://img.coca.cc/file/imgsgj/img.jpg 指向 https://f001.backblazeb2.com/file/imgsgj/img.jpg

根据上面截图中的记录, 我使用这个子域名 img.coca.cc作为图床的域名, 并且指向 f000.backblazeb2.com. 确保 Cloudflare 橙色保护盾是开启的状态, 这代表请求是通过了 Cloudflare 的 CDN 代理层. Cloudflare 默认的 TTL 将被设置为 auto(自动).

虽然启用了CloudFlare CDN,但发现缓存永远不能命中(MISS),我们需要对添加一个缓存指令(默认是不缓存),打开存储桶设置,桶信息设置为{“cache-control”:“max-age=43200”},其中43200单位为秒(s),意思就是说43200秒内CF不会去从源站重新获取资源。

Cloudfalre的ssl设置需要使用full,因为backblaze仅提供https访问地址。

当然你如果觉得文件链接不好看太长了,你也可以使用cloudflare自带的页面规则301 ,缩短链接地址,比如通过 https://img.coca.cc/img.jpg 直接访问 https://f001.backblazeb2.com/file/imgsgj/img.jpg
例:
匹配规则 https://img.coca.cc/*
重定向网址到 https://f001.backblazeb2.com/file/imgsgj/$1

加一条页面缓存规则

最后,请注意:Backblaze B2 流出到 Cloudflare 的流量是免费的,也就是说就算 CF 回源 B2 也没有 $0.01/GB 的流出流量费,相当于免费无限流量。不过这并不能阻止坏蛋直接用 B2 的域名(而不是套了 CF 的域名)刷流量。

最后修改:2021 年 03 月 01 日

文章2:Backblaze B2 + Cloudflare CDN + PicGo

前言

近期,由于服务器需要扩展功能,以及阿里云推送日志时有所不便决定重新购买服务器并部署相关网站和服务。决定趁此机会对图片存储进行规范,由于网站未备案,国内的阿里云OSS+阿里云CDN、又拍云、七牛云等厂家提供的服务无法享受,只能将目光转向国外。

原本使用Github+JSDelivr是一个很好的免费图床解决方案,且网上教程也很多,但2020年8月9日JSDelivr发布的新使用政策中第四条引起讨论

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
4. Prohibited Use

The following behavior is prohibited:

1. Hosting or accessing content that:
- contains malware or harmful code in any form,
- violates proprietary rights of others,
- is sexually explicit,
- is potentially illegal in the EU or the USA.

2. Abusing the service and its resources, or using jsDelivr as a general-purpose
file or media hosting service. This includes, for example:
- running an image hosting website and using jsDelivr as a storage for all
uploaded images,
- hosting videos, file backups, or other files in large quantities.

We recognize that there are legitimate projects that consist of a large number
of files, and these are not considered abuse. For example: icons packs, apps,
or games with a large number of assets.Copy

running an image hosting website and using jsDelivr as a storage for all uploaded images这句话有所歧义,因为无法判断个人博客和文章上传的图片数量和访问量是否会被判定为图片存储站,导致封禁或删除数据,只能寻求其余解决方案。

此时发现Cloudflare Bandwidth Alliance宽带联盟宽带联盟中包含Backblaze,Backblaze到Cloudflare的所有出口流量完全免费。再加上Backblaze对个人用户提供10G的免费存储额度,每天1G的下载量与无限上传量。我们可以同时使用两者达到10G免费额度与不限量上传下载。

在超过免费存储额度之后,相比其他几家国外主流OSS服务提供商,Backblaze的价格也较为低廉,唯一的缺点是目前只支持信用卡支付。

前置条件

  1. 一个域名~ 最好是一级域名,即xxx.xxx这种类型的。搜索任意域名供应商即可购买,比较推荐NameSlio,支持支付宝付款,免费的Whois隐私保护,同时价格便宜。.com域名每年仅需要9.95美金,如果不是很在乎可以买其他后缀只买首年,2美金一年。免费域名也有一些可以申请,比较出名的就是freenom的域名了,不过听说今年Cloudflare的免费服务不再支持免费域名,所以只能自己试试是否能够成功。

Backblaze OSS部分

  1. 此处进入,创建Backblaze账号并完善相关信息,直接从首页进入可能没有Sing Up选项

  2. 此处进入控制台,创建Buckets存储桶存储桶

  3. 给存储桶起一个名字方便识别且不易被猜测即可,无需在意生成的图片链接长短,后续可以进行重定向方便识别且不易被猜测即可,无需在意生成的图片链接长短,后续可以进行301重定向,并将Files in Bucket are修改为Public
    注意:给存储桶起名时尽量起不易被别人猜测的名字,可在其中增加部分随机字符,如c42rx71-example-winer-website,因为在存储桶的模式为Public时,别人只需知道你的OSS服务提供商+存储桶名称+其中一个文件名,即可拼凑出文件真实链接,从而绕过CDN刷空你的免费流量,如果有绑定支付方式还会扣费。

  1. 点击Upload/Download上传一张图片或临时文件,用于后续获取存储桶所在的服务器地址

  2. 从左侧菜单栏的Browse Files进入刚刚的存储桶并找到上传的文件,点击查看详细信息,记住Friendly URL行的链接内容

  1. Friendly URL的链接可以看到我们的存储桶位于https://f002.backblazeb2.com/,而/file/example-winer-website则是存放文件目录的相对路径,记住这两个值后登陆Cloudflare进行设置。

Cloudflare部分

  1. 打开Cloudflare官网并进行注册

  2. 根据提示前往域名注册商修改DNS解析服务器到Cloudflare提供给你的服务器地址不同用户地址不同不同用户地址不同,个人使用选择免费计划即可

  1. 添加一条CNAME记录到你刚刚得到的存储桶服务器,二级域名可以根据喜好选择,但一般使用这几种

    1
    2
    3
    4
    5
    oss
    img
    images
    assets
    static(不仅存放图片,还存放网站加载时的css、js文件)

  1. 此时等待DNS解析完成后我们就完成了通过Cloudflare访问Backblaze的设置,可以使用浏览器的开发者工具,访问二级域名下对应网址来查看是否命中CDN缓存。cf-cache-status行HIT代表命中缓存,MISS代表没有命中CDN缓存,回源到Backblaze,此时会消耗下载流量。

  1. 为了避免无法命中缓存或回源次数过多导致加载速度低下,我们需要回到Backblaze进行桶信息设置,添加{"cache-control":"max-age=86400"},意味86400秒内Cloudflare不再返回源站重新获取信息。
    注意,回源时为CDN节点回源站重新拉去数据,然后再传递给用户,并不是将源站地址直接转给用户,所以无需担心回源过多导致的免费流量配额消耗完毕。max-age可以不用太长,太长的话若源文件发生更改,且站点没有主动推送到CDN节点时会导致用户不能及时得到最新版本。(书写本文时发现BackBlaze也存在免费请求次数显示,B类C类请求每天各2500次,暂时未确定Cloudflare访问是否计算请求次数,故也不建议太短)

  1. 可选可选不建议使用的重定向方式不建议使用的重定向方式通过cloudflare自带的页面规则301,对于文件连接进行重定向缩短链接地址。按照下图选项根据喜好进行创建即可,*用于匹配所有的图片路径及名称,$1代表使用星号部分的内容对网址进行补全。
    注意:

1.匹配URL时,地址中的/img是必须的否则被转发过的URL会再次匹配到转发规则,造成重定向次数过多或其他位置错误,但是/img可以替换为任意不为/file/example-winer-website(你的存储桶名)的字符串
2.经过测试后发现,使用该方式进行的重定向在开发者工具Network页面可以抓取到重定向后的链接直接新标签打开图片也可以获取直接新标签打开图片也可以获取,从而得到你的存储桶名称以及真是文件名,配合服务器提供商即可拼凑真实地址进行恶意刷流量攻击。故建议使用第8步的第二种创建方式。

  1. 可选可选在查找资料时,见到有些地方建议在进行URL重定向后增加一条页面缓存规则来防止缓存失效。按照下图进行配置即可。但是在我进行测试时发现不增加这条内容,也可以命中Cloudflare的CDN缓存,故暂时未添加。也可以在此处增加安全级别选项,并设置为本质上为关,来保证主站被攻击在CDN环节增加验证时,写在本地的Markdown文档能够正常加载图片。
    猜测存在此步骤的可能原因是将缓存级别设置无查询字符串时仅在图片后不跟随参数时使用缓存的内容,部分OSS供应商提供追加参数对图片进行处理(如压缩、剪裁、缩放)后发送的功能,若主站缓存级别设置为标准,此处修改部分内容设置后就可以使用那些功能。但Backblaze的免费服务并不包含这些,所以暂时用不到。若以后发现在问题或真正的原因会进行补充说明。

8.可选可选建议使用的重定向方式建议使用的重定向方式由于不使用链接重定向和使用页面规则重定向均会暴露桶名称,我们选择通过重写的方式进行解决。这种方式可以在链接不变的情况下改写其中的内容。这次我们使用规则中的转换规则进行页面重写。匹配主机名用于确定请求来源需要进行重写,且再次匹配完整URI确认不包含已经重写过的链接,避免出现反复重写的错误。重写路径的concat含义为将两字符串拼接,在请求的文件路径前添加存储桶路径,而主机名example.winer.website在使用concat函数时无需书写,会自动添加为传入请求的主机名。(如一定要在concat函数内添加主机名,请不要带http://https://开头,而是在前面添加/进行替代,例如concat("/example.winer.website/file/example-winer-website", http.request.uri.path)
注:如果页面规则剩余不足或不想使用本方法,也可以参考本文创建私有存储桶并使用Cloudflare Workers来进行访问。鉴于Workers访问方法已存在很久,且有众多其他博主教程,不再进行书写。但Workers同样有免费限额,请注意。

搭配PicGo更好的进行图床食用

首先恭喜你,至此你已经完成了图床基本搭建工作!下面是拓展部分

  1. 图床搭建完毕后,若不进行其他操作,每次上传图片都需要打开Backblaze的网站并在完成身份验证后进入桶设置页面进行上传,即不便捷也不友好。因此介绍一款跨平台且同时支持命令行与可视化界面的图片上传工具——PicGo
    主要功能即为上传图片到你指定的位置,并获取图片链接,搭配typora编辑器可以直接在粘贴图片时就自动上传并将链接写入Markdown文档,避免图片在其它网站或放在本地后移动文档导致的图片丢失。

  2. 进入项目主页,下载并安装PicGo

  3. 选择插件设置,搜索s3或进入插件项目主页下载并安装该插件

  4. 安装完毕后左侧的图床设置会多出“Amazon S3”,对于所有与S3 API兼容的云存储均可使用

  5. 打开的Backblaze官网的AppKeys设置页面,添加一个新的Key建议不要使用建议不要使用MasterApplicationKey,按照如下格式设置并申请Key
    注意:Key的最长有效时间为1000天,即86400000秒,过期后请重新申请

  1. 记录得到的Key ID、applicationKey、桶名称、桶的Endpoint地址分别填写到对应位置。同时将301跳转或页面重写的网址填写到自定义域名。其余设置无需变更。保存后即可上传图片,也可以修改文件的命名方式或通过修改配置文件进行设置,详见此页面

注意事项

到此为止所有工作都已完成,但是有一点需要注意:

  1. 通过这种方式上传文件,文件路径中如果包含空格,在Backblaze存储时会将空格换为加号,所以路径中包含空格的文件PicGo上传后生成的链接并不正确。

  2. 通过此方法搭建的图床或书写的教程,切记不要泄露存储桶名称,避免刷流量,且建议给所有上传文件的命名规则添加哈希值,使其不可猜测,避免存储桶名称暴露时获取其他文件。

同时本文内建立的存储桶并未使用,教程书写完毕后立刻删除,并创建了及其难以猜测的存储桶名称更改了相关地址,无需尝试使用文中或图中的信息进行访问测试。

最后修改:2022 年 08 月 28 日 10 : 37 AM

评论区

刚下飞机的道士 May 24th, 2022 at 11:48 am

感谢大佬文章,现在cloudflare提供了transform rules,可以不用worker进行路径重写了。

sakuya April 9th, 2022 at 02:44 pm

友情提示:
第8步的concat"/example.winer.website/file/example−winer−website",http.requrst.uri.paht),似乎多了个括号,以及request、path写错了

winer August 28th, 2022 at 10:36 am

@sakuya

谢谢提醒,括号多的那个其实是因为外面有个中文的括号,只看有代码标记的里面就行
不过request和path确实是打错了hhhhh图片里还没错,这就改掉

文章3:Backblaze B2 + Cloudflare

B2是Backblaze提供的一个OSS存储服务,有着10G的免费容量以及每天1G的免费流量。而且他还是Cloudflare带宽联盟的成员,通过Cloudflare传输Backblaze中的内容是完全免费的。即使在超出免费额度的情况下,$0.005 GB/Mo的的容量和$0.01 GB/Mo的流量价格比起其他存储服务的价格也十分便宜。

有许多其他文章也介绍了如何使用B2和CF作为免费图床,但现在CF有了新的转换规则功能,和其他文章使用的Worker和页面规则比起来,转换规则提供了更多的免费条目,也更易于使用。

当然用来作为网盘也可以,不过10G就不太够用了。

要求

首先需要注册Backblaze B2和Cloudflare的账号,其次需要一个域名,现在Cloudflare就提供域名购买,也可以从namesilo或者其他地方购买后给Cloudflare解析。Backblaze注册之后需要进行邮箱验证,不然无法创建公开存储桶。

创建存储桶

进入Backblaze的用户管理界面,选择B2云存储下面的桶选项,然后点击创建存储桶,创建时需要输入桶的名称,这个名称会包含在URL中,所以不能与其他人的桶活着自己的其他桶有同样的名字。创建时需要选中公众选项,将其设置为公开的,其他选项不需要修改。

在创建完成后可以在里面上传一张图片,点击上传后的图片,其中友好URL就是要使用的地址,接下来记录下友好URL的主机名,例如f00x.backblaze2.com

刚创建的存储桶默认不会被Cloudflare缓存,而是每次都要回源,对于图床来说,缓存下来才更方便。点击桶选项,回到刚才创建存储桶的地方,可以看到已经创建好的存储桶,点击桶设定,将桶信息修改为{"cache-control":"max-age=43200"},其中max-age=后面的数字为Cloudflare的缓存时长,单位为秒。

配置Cloudflare

在Cloudflare中为图床要使用的子域名创建一个CNAME记录,将其指向刚才记录下的主机名f00x.bckblze2.com,由于要使用Cloudflare的CDN进行缓存,所以要将代理状态设置为已代理。

在创建CNAME记录之后,将友好URL的主机名换成刚创建的域名就可以访问文件了。如果测试时Cloudflare提示错误522,这是因为Backblaze只允许使用Https访问,需要在Cloudflare的SSL/TLS中改成完全(严格)。此外,如果是Cloudflare的Pro付费用户的话,还需要关闭自动签名交换(SXG),他在速度-优化选项中。

直接使用CNAME域名修改URL的话的话会暴露存储桶的名称,也显得URL十分啰嗦,这时候就需要使用Cloudflare的转换规则来将URL缩短。

选择规则-转换规则,然后点击创建转换规则-重写URL创建一个重写URL的规则,首先为规则取一个名字。如果使用单独的子域名作为专用的图床域名的话,可以直接在字段中选择主机名,在运算符中选择等于,然后在值当中输入子域名。

如果图床并不是使用专门的子域名,需要点击编写表达式,并参照Cloudflare文档来编写如何匹配图床的URL地址。

匹配表达式配置完成后,在下面的重写-路径中选择重写到,在选项中选择Dynamic,如果只想在URL中删去/file/存储桶名称的话,在后面填写concat("/file/存储桶名称", http.request.uri.path),如果有其他要求,也可以参照上面的Cloudflare文档来修改。设置完成后点击部署即可启用该规则。现在输入https://img.example.com/桶中的文件路径或是自定义的地址即可加载存储桶中的图片。

以下是用这种方式上传的图片,另外如果有人认得作者是谁可以在评论里回复一下。

图片略…

参考

Free Image Hosting With Cloudflare Transform Rules and Backblaze B2

Backblaze B2 + Cloudflare CDN可自定义域名的10G高速免费外链图床

Backblaze+CloudFlare实现0成本简单图床