前言
近期,由于服务器需要扩展功能,以及阿里云推送日志时有所不便决定重新购买服务器并部署相关网站和服务。决定趁此机会对图片存储进行规范,由于网站未备案,国内的阿里云OSS+阿里云CDN、又拍云、七牛云等厂家提供的服务无法享受,只能将目光转向国外。
原本使用Github+JSDelivr是一个很好的免费图床解决方案,且网上教程也很多,但2020年8月9日JSDelivr发布的新使用政策中第四条引起讨论
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的价格也较为低廉,唯一的缺点是目前只支持信用卡支付。
前置条件
- 一个域名~ 最好是一级域名,即xxx.xxx这种类型的。搜索任意域名供应商即可购买,比较推荐NameSlio,支持支付宝付款,免费的Whois隐私保护,同时价格便宜。
.com
域名每年仅需要9.95美金,如果不是很在乎可以买其他后缀只买首年,2美金一年。免费域名也有一些可以申请,比较出名的就是freenom的域名了,不过听说今年Cloudflare的免费服务不再支持免费域名,所以只能自己试试是否能够成功。
Backblaze OSS部分
- 从此处进入,创建Backblaze账号并完善相关信息,直接从首页进入可能没有Sing Up选项
- 从此处进入控制台,创建Buckets(存储桶)
- 给存储桶起一个名字(方便识别且不易被猜测即可,无需在意生成的图片链接长短,后续可以进行301重定向),并将
Files in Bucket are
修改为Public
注意:给存储桶起名时尽量起不易被别人猜测的名字,可在其中增加部分随机字符,如c42rx71-example-winer-website
,因为在存储桶的模式为Public时,别人只需知道你的OSS服务提供商+存储桶名称+其中一个文件名,即可拼凑出文件真实链接,从而绕过CDN刷空你的免费流量,如果有绑定支付方式还会扣费。
- 点击
Upload/Download
上传一张图片或临时文件,用于后续获取存储桶所在的服务器地址 - 从左侧菜单栏的
Browse Files
进入刚刚的存储桶并找到上传的文件,点击查看详细信息,记住Friendly URL
行的链接内容
- 从
Friendly URL
的链接可以看到我们的存储桶位于https://f002.backblazeb2.com/
,而/file/example-winer-website
则是存放文件目录的相对路径,记住这两个值后登陆Cloudflare进行设置。
Cloudflare部分
- 打开Cloudflare官网并进行注册
- 根据提示前往域名注册商修改DNS解析服务器到Cloudflare提供给你的服务器地址(不同用户地址不同),个人使用选择免费计划即可
添加一条CNAME记录到你刚刚得到的存储桶服务器,二级域名可以根据喜好选择,但一般使用这几种
oss img images assets static(不仅存放图片,还存放网站加载时的css、js文件)
- 此时等待DNS解析完成后我们就完成了通过Cloudflare访问Backblaze的设置,可以使用浏览器的开发者工具,访问二级域名下对应网址来查看是否命中CDN缓存。
cf-cache-status
行HIT代表命中缓存,MISS代表没有命中CDN缓存,回源到Backblaze,此时会消耗下载流量。
- 为了避免无法命中缓存或回源次数过多导致加载速度低下,我们需要回到Backblaze进行桶信息设置,添加
{"cache-control":"max-age=86400"}
,意味86400秒内Cloudflare不再返回源站重新获取信息。
注意,回源时为CDN节点回源站重新拉去数据,然后再传递给用户,并不是将源站地址直接转给用户,所以无需担心回源过多导致的免费流量配额消耗完毕。max-age可以不用太长,太长的话若源文件发生更改,且站点没有主动推送到CDN节点时会导致用户不能及时得到最新版本。(书写本文时发现BackBlaze也存在免费请求次数显示,B类C类请求每天各2500次,暂时未确定Cloudflare访问是否计算请求次数,故也不建议太短)
- (可选)(不建议使用的重定向方式)通过cloudflare自带的页面规则301,对于文件连接进行重定向缩短链接地址。按照下图选项根据喜好进行创建即可,*用于匹配所有的图片路径及名称,
$1
代表使用星号部分的内容对网址进行补全。
注意:
1.匹配URL时,地址中的/img
是必须的否则被转发过的URL会再次匹配到转发规则,造成重定向次数过多或其他位置错误,但是/img
可以替换为任意不为/file/example-winer-website(你的存储桶名)
的字符串
2.经过测试后发现,使用该方式进行的重定向在开发者工具Network页面可以抓取到重定向后的链接(直接新标签打开图片也可以获取),从而得到你的存储桶名称以及真是文件名,配合服务器提供商即可拼凑真实地址进行恶意刷流量攻击。故建议使用第8步的第二种创建方式。
- (可选)在查找资料时,见到有些地方建议在进行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更好的进行图床食用
首先恭喜你,至此你已经完成了图床基本搭建工作!下面是拓展部分
- 图床搭建完毕后,若不进行其他操作,每次上传图片都需要打开Backblaze的网站并在完成身份验证后进入桶设置页面进行上传,即不便捷也不友好。因此介绍一款跨平台且同时支持命令行与可视化界面的图片上传工具——PicGo
主要功能即为上传图片到你指定的位置,并获取图片链接,搭配typora编辑器可以直接在粘贴图片时就自动上传并将链接写入Markdown文档,避免图片在其它网站或放在本地后移动文档导致的图片丢失。 - 进入项目主页,下载并安装PicGo
- 选择插件设置,搜索
s3
或进入插件项目主页下载并安装该插件 - 安装完毕后左侧的图床设置会多出“Amazon S3”,对于所有与S3 API兼容的云存储均可使用
- 打开的Backblaze官网的AppKeys设置页面,添加一个新的Key(建议不要使用Master Application Key),按照如下格式设置并申请Key
注意:Key的最长有效时间为1000天,即86400000秒,过期后请重新申请
- 记录得到的
Key ID、applicationKey、桶名称、桶的Endpoint地址
分别填写到对应位置。同时将301跳转或页面重写的网址填写到自定义域名。其余设置无需变更。保存后即可上传图片,也可以修改文件的命名方式或通过修改配置文件进行设置,详见此页面。
注意事项
到此为止所有工作都已完成,但是有一点需要注意:
- 通过这种方式上传文件,文件路径中如果包含空格,在Backblaze存储时会将空格换为加号,所以路径中包含空格的文件PicGo上传后生成的链接并不正确。
- 通过此方法搭建的图床或书写的教程,切记不要泄露存储桶名称,避免刷流量,且建议给所有上传文件的命名规则添加哈希值,使其不可猜测,避免存储桶名称暴露时获取其他文件。
同时本文内建立的存储桶并未使用,教程书写完毕后立刻删除,并创建了及其难以猜测的存储桶名称更改了相关地址,无需尝试使用文中或图中的信息进行访问测试。
4 comments
Nicely put. Appreciate it!
感谢大佬文章,现在cloudflare提供了transform rules,可以不用worker进行路径重写了。
友情提示:
第8步的concat("/example.winer.website/file/example-winer-website", http.requrst.uri.paht)),似乎多了个括号,以及request、path写错了
谢谢提醒,括号多的那个其实是因为外面有个中文的括号,只看有代码标记的里面就行
不过request和path确实是打错了hhhhh图片里还没错,这就改掉