1.前言
搭建个人博客、网站最头疼的莫过于图片存储的问题了吧,上传到免费图床站点就怕它哪天跑路,利用Github当图床访问速度又慢。
最稳妥的方案还是使用大厂的云存储服务,比如我之前用过的腾讯云COS,只不过也并没有想象中那么美好。。。
它的后台界面极其复杂、难用就不说了。我们使用对象存储首先要考虑的就是防坏蛋盗刷流量,否则,很可能一觉醒来一套房就没了。 (夸张了点)
而腾讯云COS服务没有提供相关防护功能,需要接入腾讯云CDN服务(这是另外收费的),接入腾讯云CDN后,才有抵御攻击以及流量封顶相关配置。再一个就是,接入腾讯云CDN还需要一个国内已备案的域名。总之,对于个人博客、网站来说过于麻烦,也不划算。
2.零成本个人图床方案
后来无意中发现了Cloudflare+Backblaze这套组合搭建图床的方案,完美地符合了我的需求!
Cloudflare(cloudflare-cn.com)免费提供CDN全球加速、以及不计量的DDoS攻击防护,Backblaze(backblaze.com)云存储前10GB空间免费(用来当个人图床完全够用),需要更大容量的话,它也有着秒杀大厂的实惠价格:
最关键的是Cloudflare和Backblaze都是Bandwidth Alliance(带宽联盟)的成员,它们之间的数据传输(带宽)是免费的,而Cloudflare的CDN服务也不收费,那么这样一来就不用担心流量费用的问题!
没有对比就没有伤害,相比于某些知名大厂,Cloudflare和Backblaze不仅对于平民用户非常友好,最令我感到舒服的更是它们两的后台界面逻辑,非常简洁、直观,一看就懂!
说了这么多,无非就是想表达我对这套方案十分满意,好的产品、服务就应该让更多的人知道!相信你也心动了,接下来搭建教程献上~
3.Backblaze账号注册
进入Backblaze官网
点击B2 Cloud Storage注册账号
进入账号后台页面
4.存储桶创建与上传文件
点击Create a Bucket创建存储桶
设置桶名(建议复杂一点,更安全),选择Public公开,其它选项保持默认
点击Lifecycle Settings
选择只保留最新版本文件—Keep only the last version of the file
点击Upload/Download随便上传一张图片
上传完成后,打开图像查看详细信息
5.Friendly URL
在文件详细信息中,有一个Friendly URL,它就是Backblaze云存储提供的日常引用、访问文件的原始链接,但我们肯定不能使用这个原始链接
由于Backblaze云存储是有每日限额的,如果我们使用原始链接请求,那么是直接从Backblaze请求数据,是会消耗免费额度的:
Daily Storage Caps:日常存储容量前10GB免费
Daily Download Bandwidth Caps:日常下载带宽前1GB免费
Daily Class B Transactions Caps:日常B类事务前2500次免费(B类事务包括下载、获取文件)
Daily Class C Transactions Caps:日常C类事务前2500次免费(C类事务包括创建存储桶、列举存储桶、列举文件版本、列举Keys)
所以如果我们公开的网站上面的图片都是用这种原始链接的话,那么免费额度很快就会被访客用完。而且这个链接不仅暴露了你用的云存储厂商,还暴露了你的桶名,坏蛋直接搞个脚本无限盗刷你的额度,一觉醒来又一套房没了 。。。
这时候就要用到Cloudfare了,将我们自己的域名托管到Cloudfare,使用Cloudfare代理并启用免费的CDN服务,再将域名指向自己的Backblaze云存储地址,这时候使用自己定义的链接请求就是走的Cloudfare而不是Backblaze了。
由于Cloudfare和Backblaze同属带宽联盟成员,它们之间数据传输免费,借由Cloudfare向Backblaze请求数据就不会消耗Backblaze的额度!而且Cloudfare的CDN服务还能够有效提升访问速度。
要开始下面的操作,首先你要有一个自己的域名,建议在国外注册商那里购买,这里推荐我自己最常用的NameSilo,NameSilo购买域名,免去实名、备案的麻烦。
6.Cloudfare添加CNAME记录
关于Cloudfare如何托管域名,免费CDN加速,免费申请有效期15年的证书,这里就不再赘述了。
将你的域名托管到Cloudfare后,打开DNS>Records,点击Add record添加记录
在Cloudfare中添加一条CNAME记录,做好以下设置后点Save保存:
二级域名自定义,这里我设置成img
Target设置为你的Friendly URL的域名
将Proxy status设置为开启,这样就会同时启用Cloudfare代理以及CDN服务
TTL默认Auto
打开SL/TLS>Overview,将SSL/TLS的加密模式设置为完全(严格)
现在就可以用自定义的域名访问刚才的文件了:
// 原先的:
https://f005.backblazeb2.com/file/oneyangcrown-bucket/avatar.jpg
// 现在的:
https://img.oneyangcrown.top/file/oneyangcrown-bucket/avatar.jpg
7.额度消耗测试
接下来做个简单的测试,对比使用原始链接以及自定义链接请求后,Backblaze云存储额度的消耗情况。
这是bat脚本,使用curl工具来发起请求,url参数为请求链接,iterations参数是请求次数
@echo off
set url=https://f005.backblazeb2.com/file/oneyangcrown-bucket/avatar.jpg
set iterations=50
for /l %%i in (1,1,%iterations%) do (
curl -X GET "%url%"
)
测试结果:可以看到当我使用原始链接请求50次后,流量消耗了5MB,Class B事务增加了50次,而换成自定义链接再次请求50次后,额度消耗几乎没有了:
实不相瞒,我也不清楚为啥还是会有一丁点消耗 ,我预想的应该是零消耗,可能是Backblaze和Cloudfare订好的计费规则吧。
我看带宽联盟的介绍也有说是折扣或免除数据传输费用,这样看来的话,那应该就不是完全免除而是折扣,不过也非常良心了!
8.优化链接
前面我们已经更换了域名,但是链接中还是有存储桶的名称:
https://img.oneyangcrown.top/file/oneyangcrown-bucket/avatar.jpg
暴露存储桶名称是有风险的,如果坏蛋知道你的用的是Backblaze云存储,那么他是能拼凑出你的原始链接的,所以接下来要做的是把链接中的这一段/file/oneyangcrown-bucket
去掉,这里用到的是Cloudflare的转换规则。
点击Cloudflare仪表板左侧的Rules>Transform Rules
选择Rewrite URL,点击Create rule创建URL重写规则
填上规则名称(随意,主要用来表明规则的用途),选择Custom filter expression
点击Edit expression
输入not starts_with(http.request.uri.path,"/file/oneyangcrown-bucket")
❗注意:这里第二个参数的值要改成你自己的,还有后面步骤的第一个参数
选择Rewrite to…,选择Dynamic,输入concat("/file/oneyangcrown-bucket",http.request.uri.path)
点击Deploy部署规则
这样规则就启用成功了:
现在就可以用优化好的链接访问刚才的文件了:
// 原先的:
https://img.oneyangcrown.top/file/oneyangcrown-bucket/avatar.jpg
// 优化的:
https://img.oneyangcrown.top/avatar.jpg
9.优化响应头
在浏览器中打开开发人员工具(默认快捷键是F12),可以看到在请求链接时,响应头有一些X-Bz开头的字段,这些都是和Backblaze云存储相关的,要把它们都隐藏掉。
PS:也可以使用curl工具来获取响应头信息
curl -I https://img.oneyangcrown.top/avatar.jpg
打开Rules>Transform Rules,选择Modify Response Header,点击Create rule创建响应头修改规则
选择All incoming requests,通过点击Set new header来添加一行Header配置,将类型设置为Remove,将所有X-Bz开头的字段添加进去,然后点击Deploy部署规则即可
X-Bz-Content-Sha1
X-Bz-File-Id
X-Bz-File-Name
X-Bz-Info-Src_last_modified_millis
X-Bz-Upload-Timestamp
最后再次测试、查看响应头信息中,规则配置好的字段是否都已移除
10.缓存设置
在前面的额度消耗测试中,之所以使用Cloudfare链接还会有一些消耗,其实是因为缓存控制默认是不缓存的。查看响应头中Cache-Control字段,会发现它的值是max-age=0(资源缓存的有效期限为0,也就是不缓存)。
所以每次通过Cloudfare链接去请求都无法命中CDN缓存,对应的字段就是Cf-Cache-Status的值为MISS,值为HIT才是命中缓存。
这样每次Cloudfare都会直接到Backblaze源服务器去取数据,因为Cloudfare在自己的CDN服务器上找不到缓存数据。
但得益于带宽联盟,借由Cloudfare去向Backblaze取数据,有相应折扣或免除数据传输费用,虽然官方没有明确说明,目前看来就是折扣,所以才会产生一些消耗。
所以,如果开启缓存,那么额度消耗还可以降到更低。
相关文档—Cloudfare CDN默认缓存行为:
Default Cache Behavior · Cloudflare Cache (CDN) docs
点击Bucket Settings
设置Bucket Info为{"cache-control":"max-age=5184000"}
,5184000秒(也就是60天),最后点Update Bucket保存设置
对于图床数据来说,图片文件不是新增就是删除,一般不会去修改一个图片文件,所以缓存有效期限可以设置更长,没必要让服务器那边频繁更新缓存数据。
查看响应头字段是否已更新过来:
缓存设置完成后,现在再通过Cloudfare链接去测试多次请求同一资源的话,只要CDN服务器上已经缓存了数据,那么后续请求就都是零消耗。
11.PicGo设置
PicGo是一个用于快速上传图片并获取图片URL链接的工具。
11.1 申请Application Key
在Backblaze云存储中打开Application Keys,点击Add a New Application Key
配置好Application Key后,点击Create New Key创建即可
Allow access to Bucket(s):指定该Key允许访问的存储桶
Type of Access:访问权限,设置为Read and Write
勾选Allow List All Bucket Names
Duration:有效期(单位是秒),留空就是永久有效,直到你删除它。为了提高安全性,也可以自己设定一个期限。
复制keyID和applicationKey,特别是applicationKey,只会显示一次,忘记的话重新创建一个新的Application Key即可
11.2 s3插件设置
首先确保你的设备已安装Node.js环境
然后在PicGo插件设置中搜索s3插件并安装:
安装完毕后左侧的图床设置会多出Amazon S3设置,对于所有与S3 API兼容的云存储均可使用。
S3设置需要填入的信息:
首先是前两项,就是前面申请的Application Key,应用密钥ID—keyID,应用密钥—applicationKey
桶名:桶相关信息的标题(如下图所示),也可以查看Bucket Settings中的Bucket Unique Name
文件路径:{fullName},表示使用源文件名,上传到根目录
地区:对应Endpoint的第二部分,比如我这里要填的是us-east-005
自定义节点:填入Endpoint链接,前面加上https://
自定义域名:前面在Cloudfare自己设定的域名
其它选项:
ForcePathStyle:no关闭
拒绝无效TLS证书连接 :yes开启,如果出现证书错误可以关闭
ACL访问控制列表:public-read
Bucket前缀:false
最后在PicGo设置中,开启时间戳重命名,这样能够确保上传的每一张图片名字都是唯一的:
12.数据备份
为了防止一些不可预料的事故发生,导致数据丢失,建议定期做好数据备份。
12.1 手动备份
选择要备份的桶,点击Make Full Bucket Snapshot创建一个快照
在Snapshots中就可以看到已创建的快照,等待快照准备完成就可以下载了
12.2 群晖Cloud Sync自动备份
如果你有一台NAS,那么就可以实现自动备份,比如群晖的Cloud Sync就支持Backblaze云存储备份。
打开Cloud Sync,创建新链接,选择Backblaze B2
设置Application Key和桶名
由于同步会消耗额度,所以轮询期不要设置太短,这里我设置的是24小时