之前一直是用的pixc+Github搭建的图床,自从上次上网冲浪看见有人说github搭建图床有封号的可能,搞得我夜不能寐,找了非常多的解决方案,恰好也完成了域名注册,乘着文章数还不是很多就开始着手起图床的搭建了
我这里选择的方案是:
Cloudflare+Backblaze+PicGo
以下是我在网上找到的较为完整的图文教程
源地址:https://blog.kitemoon.cn
B2+cloudflace+Picgo实现图床
前排提醒
任何非付费得到计划都有风险,个人建议从两方面入手,别绑卡,别给真实信息,这样跑炸了也不会经济损失
同时请注意,务必注意,CF对国内加速效果很差劲,所以推荐国际网站使用。
文中所有信息都需要结合实际情况进行填写,切勿随意乱填
小本本非常重要,请务必按照实际情况记录。
准备工作
一个域名:需要NS解析到cloudflare
一个B2账号:需要能开桶
一个cloudflace:Free版本就行
正篇
B2设置
创建B2桶
首先,我们需要前往网站https://www.backblaze.com/zh_CN/cloud-storage.html
注册一个账号,注册账号后我们进入桶界面,创建一个新的桶

点击后,我们设置桶的名称和信息(注意,选择公众)其他均选择停用,如图所示

创建后,我们可以看到桶信息,选择上载/下载

进入后,选择上载,随便上载一个图片

上载后,我们点击该文件,打开详细信息,找到友好URL

这里注意,我们复制友好链接中主机那段信息f004.backblazeb2.com出来单独保存(注意,每个人这里都不一样)
我们单独写在我们的记事本上
# 记事本
f004.backblazeb2.com
记录桶信息
接着,我们找到桶信息页,记录下地域和桶名称

# 记事本
URL:f004.backblazeb2.com
桶名称:TESTTEST123123SS
Endpoint:s3.us-west-004.backblazeb2.com
修改桶缓存信息
我们需要设置好桶的缓存,这样可以节约部分流量费
首先,我们打开桶设定

将桶设定中桶信息设定为下面这个json,修改后如图所示
{"cache-control":"max-age=720000"}

设定好后,我们点击更新桶,完成更新。至此,我们在B2设定就告一段落
cloudflare设置
首先,我们需要提前将域名NS设置到cloudflare中,这些工作都是准备工作,因此不在赘述,我们现在进入DNS管理页,进行设置
DNS解析设置
首先,我们来到DNS页,选择添加记录

这里,我们按照自己的想法,设定好主机名,然后选择cname记录,目标选择为我们刚才在记事本内记录的URL
注意,这里代理状态必须要是已代理
# 记事本
URL:f004.backblazeb2.com <-就是这个
桶名称:TESTTEST123123SS
Endpoint:s3.us-west-004.backblazeb2.com

设置完毕后,我们点击保存,保存后等待10分钟,按照下面这个格式访问,应该就可以访问成功了
# 访问方式
https://<主机名>.<域名>/file/<桶名称>/<桶内实际路径>
# 比如我的主机名是cc 域名是 test.com 桶名称为TESTTEST123123SS 实际路径为 /48738560_p0_thumbnail.png
那么我就应该访问:https://cc.test.com/file/TESTTEST123123SS/48738560_p0_thumbnail.png
接着,我们就可以尝试访问了(当然这一步可能会失败,查看下一节解决)
HTTPS报错/无法访问
这个问题是因为B2储存只支持HTTPS访问,如果没有则会报错,因此我们需要前往SSL/TLS进行设置(点击路径 SSL/TLS->概述)
如图所示,我们需要将模式修改为完全模式

设置完毕后,我们访问就可以看到我们的图片了(SSL)

此时别急,拿出我们的小本本,记录一下我们访问的这个URL
# 记事本
URL:f004.backblazeb2.com <-就是这个
桶名称:TESTTEST123123SS
Endpoint:s3.us-west-004.backblazeb2.com
访问URL:https://cc.test.com/file/TESTTEST123123SS/48738560_p0_thumbnail.png
隐藏桶信息
在讲解之前,我们需要解释下为什么需要隐藏桶信息
因为我们免费图床是需要利用cloudflare和B2之间的带宽联盟来实现回源流量费免费的。
带宽联盟:
2018年的Cloudflare生日周,我们宣布正式推出带宽联盟:一群具有前瞻性的云计算和网络公司,致力于为我们的共同客户提供最佳和最具成本效益的体验
说白话:就是cloudflare联合一些公司一起,将这些公司之间的流量传输(比如从cloudflare->B2)这一段流量费给减免或者免费(原来这是一笔高额的费用,走的公网带宽)
我们通过cloudflare来浏览图片本身是免费的(cloudflare免费计划),cloudflare从B2获取图片这段路径也是免费的(带宽联盟),但是从我们从B2直接访问图片是付费的,如图所示。

因此,我们应该尽可能的避免用户直接访问B2,因此,我们需要进行如下设置来隐藏我们的信息。
首先,我们需要进入规则页面,选择转发规则
点击后我们要选中创建转换规则,然后选择URL重写,这样我们的链接就会在经过CDN节点的时候自动被转换为包含B2信息的URL,并被请求,这样我们的在外部请求的时候就不会泄露B2的相关信息了

进入页面后,我们随便给规则命名,然后当传入请求匹配时…,我们设置为以下信息
字段:主机名
运算符:等于
关于值的信息,我们掏出小本本,看一下
# 记事本
URL:f004.backblazeb2.com <-就是这个
桶名称:TESTTEST123123SS
Endpoint:s3.us-west-004.backblazeb2.com
访问URL:https://cc.test.com/file/TESTTEST123123SS/48738560_p0_thumbnail.png
我们将我们访问URL中的主机名(在记事本中,我们的主机名是cc.test.com,其实就是我们的域名)填入到值的位置
如下图所示

设置完毕后,我们向下看
在然后…这里,我们选择重写到…,并选择为Dynamic如图所示

接着我们掏出小本本
# 记事本
URL:f004.backblazeb2.com <-就是这个
桶名称:TESTTEST123123SS
Endpoint:s3.us-west-004.backblazeb2.com
访问URL:https://cc.test.com/file/TESTTEST123123SS/48738560_p0_thumbnail.png
访问URL中,我们后面跟随了一段路径,这里是/file/TESTTEST123123SS,我们需要让边缘节点帮我自动转发到这个节点,但是同时,我不希望丢失我的路径信息,如下面所示
# 原始链接:cc.test.com/48738560_p0_thumbnail.png
# 实际物理链接:cc.test.com/file/TESTTEST123123SS/48738560_p0_thumbnail.png
# 我需要服务端将cc.test.com/ 转换为->cc.test.com/file/TESTTEST123123SS
# 同时我需要保留 48738560_p0_thumbnail.png
# 因此我需要完成拼接 cc.test.com/file/TESTTEST123123SS/ + 48738560_p0_thumbnail.png
# 我们就可以利用concat函数和http.request.uri.path这个变量来实现
# concat是将两个变量/字符串拼接为一个
# http.request.uri.path是提取我们原始链接cc.test.com/48738560_p0_thumbnail.png 中的PATH部分即为:48738560_p0_thumbnail.png
# 因此,我们可以编写一个式子用来实现转换
# concat("/file/TESTTEST123123SS", http.request.uri.path)
# 这样,我们的PATH就被转换为了/file/TESTTEST123123SS/48738560_p0_thumbnail.png
# 这个过程只有边缘节点有感知,用户无感知,从而实现隐藏桶信息和转换记录
根据上述过程,我们可以编写出这样一个式子:concat("/file/TESTTEST123123SS", http.request.uri.path)
将其填入我们的框中

接着保存即可。此时,我们直接访问https://<主机名>.<域名>/<桶内路径>,就可以直接访问图片了,这样既减少了链接长度,还保护了B2的信息

设置缓存
虽然完成上述的步骤就基本可用了,但是咱们还是得给CDN上缓存,因为我们上传的图片基本不会删除,也不会变化,因此为了CDN的命中率,我们可以给这些东西设置缓存,来实现更快的访问
首先,我们要来到规则 >页面规则,新建一个规则内容如下
URL:我们刚才设置CNAME的那个域(cc.test.com),在后面加上/* 组合为:cc.test.com/*
选取设置 (必需):缓存级别
选择缓存级别 (必需):缓存所有内容
设置图如下

设置完毕后保存并部署
然后,我们再设置个页面规则
URL:我们刚才设置CNAME的那个域(cc.test.com),在后面加上/file/<桶名称>/* 组合为:cc.test.com/TESTTEST123123SS/*
选取设置 (必需):缓存级别
选择缓存级别 (必需):缓存所有内容
设置完毕后同样部署即可
这样,我们CDN的缓存命中率就明显提升了。
连接picGo
连接PicGO我们需要准备一个插件picgo-plugin-s3
我们这这里使用Picgo GUI演示
获取B2秘钥
来到B2界面,选择应用程序键,选择新建一个应用秘钥

按照图中的方式选择

设置完成后,选择创建秘钥,会返回这样一段信息

记录到小本本
# 记事本(关键信息已经脱敏)
URL:f004.backblazeb2.com <-就是这个
桶名称:TESTTEST123123SS
Endpoint:s3.us-west-004.backblazeb2.com
访问URL:https://cc.test.com/file/TESTTEST123123SS/48738560_p0_thumbnail.png
keyID:xxxxxxxxxx
keyName:xxxxx
applicationKey:xxxxxxxxxxxx
接着,我们打开我们的picgo,选择插件并安装

安装完毕后,我们转到Amazon S3设置
开始填写信息

应用秘钥ID:keyID(小本本中的keyID,每个人不一样)
应用秘钥:applicationKey(小本本中的applicationKey,每个人不一样)
桶:桶名称(小本本上的桶名称)
文件路径:按需设置,嫌麻烦可以直接/
权限:public-read
地区:不填
自定义节点:小本本中的Endpoint
自定义域名:刚才我们CNAME记录所记录的主机名+域名 (本文中是https://cc.test.com)
下面两个开关:全关
接着,点击保存即可,保存后,我们可以尝试上传图片,成功即可。
修复Picgo配置错误问题
到这里我还遇到个错误

配置过程中出现上传失败,说端口有问题,经过一番折腾,最终找到了解决方法
const bucketname = 'bsbucket'; //configuring the aws environment aws.config.update({ region:"us-west-1",
accessKeyId:"<accessKeyId>",
secretAccessKey:"<secretAccessKey>",
s3BucketEndpoint:true,
endpoint:"http://" + bucketname + ".s3.amazonaws.com" });
按照如上方式修改自己的配置即可