backblaze_cloudflare 图床配置

2024-02-24 18:32

本文主要是介绍backblaze_cloudflare 图床配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

cloudflare + back blaze 图床配置

      • 概述
      • backblaze
        • 注册 backblaze(自己的测试账号)
        • 创建bucket
        • 设置bucket header
        • 上传文件
        • 接口调用收费,每天前2500次免费,调用次数超了会报错,除非加入收费计划
        • 添加app key
      • 申请测试域名
      • cloudflare
        • 注册 cloudflare
        • cloudflare 添加 根域名
        • 添加缓存规则
          • 在域名服务商处配置dns
        • 配置worker
          • 概述
          • 具体配置
        • 缓存配置
        • 防盗链原理
      • python脚本更新worker
        • 前置条件:
          • backblaze
          • cloudflare
        • 脚本作用
        • 请求生命周期
        • 脚本正文
        • 设置敏感变量
        • 通过crontab设置脚本定时执行
      • 测试
      • 参考链接

概述

backblaze:又叫b2,是一家云存储平台,可以把自己的文件上传至云端,同时提供一个可以在外界访问的url地址。本文访问图片

cloudflare:一家CDN,缓存网页,我们的目的是缓存backblaze的图片,使用户看图的流量不走 backblaze,走 cloudflare。

backblaze 在 cloudflare 的带宽联盟中,二者之间的流量免费,在这里使用backblaze,使用户流量全部走带宽联盟

带宽联盟:https://www.cloudflare.com/zh-cn/bandwidth-alliance/

backblaze

注册 backblaze(自己的测试账号)

B2 Cloud Storage -> Sign Up

传送门

创建bucket

My Account -> Buckets -> Create a Bucket

创建的时候需要填 Bucket Unique Name,选好是 private 还是 public

这里为了防止别有用心的人士刷backblaze的流量,创建 private bucket,使用户不能直连backblaze,只能连cloudflare

设置bucket header

在默认情况下,backblaze 端会发送 cache-control header, 设为不允许缓存,此时我们访问图片的 CF-Cache-Status 为 BYPASS,绕过了缓存

这时需要在 backblaze 的 buckets -> bucket settings -> bucket info 中设置如下:

{"cache-control":"public, max-age=604800"}
上传文件

My Account -> Browse Files 或 My Account -> Buckets -> Upload/Download

在 Browse Files 界面,点击每个文件右侧的小 “i” 可显示图片链接

接口调用收费,每天前2500次免费,调用次数超了会报错,除非加入收费计划

文档

# 报错文本
Transaction cap exceeded, see the Caps & Alerts page to increase your cap.

这里需要注意,cloudflare CDN 在全球有多个站点,访问 B2 的次数不仅仅是"有多少文件就访问多少次", 还要乘一个站点数量的系数

因此,如果访问次数有可能会超过2500次的情况下,backblaze 需要配置账号支付方式(每天超过2500次之后,每10000次自动扣款),否则 backblaze 会直接限制加载图片

添加app key

MyAccount -> App Keys -> add a new application key

设置key对哪些bucket有哪些权限

key id 和 key 本体 只出现一次,要记下来!!!

申请测试域名

腾讯云买一个一年的根域名,30多块钱

腾讯云 -> 搜索域名注册 -> 买一个1年的

腾讯云 -> 控制台 -> 前往dnspod 控制台 -> 配置dns

cloudflare

注册 cloudflare

https://dash.cloudflare.com/

cloudflare 添加 根域名

cloud flare 控制台 -> 添加站点 -> 输入刚注册的根域名 -> 选择"免费"计划 -> 增加一条cname记录,把<自己随便写一个名字>.superggn.com 指向 b2 域名(f000.backblazeb2.com)

通过https://image.superggn.com/file// 访问public bucket文件

添加缓存规则

CF -> superggn.com -> Rules -> Create Page Rule

URL: image.superggn.com/*

Cache level: standard

在域名服务商处配置dns

腾讯云 -> 控制台 -> 前往dnspod 控制台 -> 配置dns

在哪里买的域名就在哪里修改

配置worker
概述

worker 实现功能:

修改入方向链接

访问b2 private bucket

具体配置

CF -> superggn.com -> workers -> 管理 workers

创建worker

暂时不进行edit操作,直接save and deploy

记住worker的名字

CF -> superggn.com -> workers -> 添加路由

路由:image.superggn.com/*

即在 配置dns 步骤得到的我们的测试域名,绑定到刚建立的 worker 上

缓存配置

CF -> superggn.com -> Rules -> Create Page Rule

设置 cache level -> standard -> save and deploy

防盗链原理

CF -> superggn.com -> Rules -> Scrape Shield

Hotlink Protection -> On

用户自己单独在浏览器中输入图片地址,还是能访问到,那防盗链是如何实现的呢?

别的网站在网页中加载图片访问我的图片地址时,请求会带这样一个 header:

Referer:referesite.com

Hotlink Protection 就是拦截所有该 header 和自己域名不符的访问请求

在工作中,一般不配置这个,因为一旦开启了防盗链,之前共享到其他网站的链接都会失效

python脚本更新worker

前置条件:
backblaze

b2 bucket name

b2 bucket id

在 bucket 获取

b2 app key id

b2 app key

在 backblaze 生成的 app key(规定了能访问哪个bucket)

cloudflare

cf worker account id

workers -> manage workers

右边栏 account id

cf worker name

cf worker api key

my profile -> api tokens -> create token

选 Edit Cloudflare Workers 模板即可

脚本作用

worker 本质上就是一个跑在某个ip上的一段脚本,所以 worker name 和 script name 是等价的

向 backblaze 发送请求,获取b2 auth token(没有这个token是访问不到 private bucket 的)(最长有效期7天,你可以试一下把 maxSecondsAuthValid 设置长一点,直接报错),将获取到的 b2 auth token 更新到 cloudflare worker script 中,实现访问授权

请求生命周期

请求——cloudflare——worker——backblaze

脚本正文

注意替换变量

import base64
import jsonimport requestsETC_ROOT = '/etc/DiceServer'with open('{}/cloudflare_backblaze_config.txt'.format(ETC_ROOT)) as f:CLOUDFLARE_BACKBLAZE_CONFIG_LIST = f.read().strip().split()# backblaze configB2_BUCKET_NAME = CLOUDFLARE_BACKBLAZE_CONFIG_LIST[1]BUCKET_SOURCE_ID = CLOUDFLARE_BACKBLAZE_CONFIG_LIST[3]# backblaze config for b64 encodingB2_APP_KEY_ID = CLOUDFLARE_BACKBLAZE_CONFIG_LIST[5]B2_APP_KEY = CLOUDFLARE_BACKBLAZE_CONFIG_LIST[7]B2_DOMAIN = CLOUDFLARE_BACKBLAZE_CONFIG_LIST[9]# cloudflare configCF_WORKER_ACCOUNT_ID = CLOUDFLARE_BACKBLAZE_CONFIG_LIST[11]CF_WORKER_API_KEY = CLOUDFLARE_BACKBLAZE_CONFIG_LIST[13]CF_WORKER_NAME = CLOUDFLARE_BACKBLAZE_CONFIG_LIST[15]flagDebug = True# An authorization token is valid for not more than 1 week
# This sets it to the maximum time value
maxSecondsAuthValid = 7 * 24 * 60 * 60  # one week in seconds# DO NOT CHANGE ANYTHING BELOW THIS LINE ###baseAuthorizationUrl = 'https://api.backblazeb2.com/b2api/v2/b2_authorize_account'
b2GetDownloadAuthApi = '/b2api/v2/b2_get_download_authorization'# Get fundamental authorization code
idAndKey = B2_APP_KEY_ID.encode() + b':' + B2_APP_KEY.encode()
b2AuthKeyAndId = base64.b64encode(idAndKey)
basicAuthString = 'Basic ' + b2AuthKeyAndId.decode('UTF-8')
authorizationHeaders = {'Authorization': basicAuthString}
resp = requests.get(baseAuthorizationUrl, headers=authorizationHeaders)if flagDebug:print("resp.status_code", resp.status_code)print("resp.headers", resp.headers)print("resp.content", resp.content.decode())print("_____________")respData = json.loads(resp.content.decode("UTF-8"))bAuToken = respData["authorizationToken"]
bFileDownloadUrl = respData["downloadUrl"]
bPartSize = respData["recommendedPartSize"]
bApiUrl = respData["apiUrl"]# Get specific download authorizationgetDownloadAuthorizationUrl = bApiUrl + b2GetDownloadAuthApi
downloadAuthorizationHeaders = {'Authorization': bAuToken}resp2 = requests.post(getDownloadAuthorizationUrl,json={'bucketId': BUCKET_SOURCE_ID,'fileNamePrefix': "",'validDurationInSeconds': maxSecondsAuthValid},headers=downloadAuthorizationHeaders)resp2Content = resp2.content.decode("UTF-8")
resp2Data = json.loads(resp2Content)bDownAuToken = resp2Data["authorizationToken"]if flagDebug:print("authorizationToken: " + bDownAuToken)print("downloadUrl: " + bFileDownloadUrl)print("recommendedPartSize: " + str(bPartSize))print("apiUrl: " + bApiUrl)workerTemplate = """
addEventListener('fetch', event => {event.respondWith(handleRequest(event.request))
})async function handleRequest(request) {let authToken = '<B2_DOWNLOAD_TOKEN>'const b2Domain = '<B2_DOMAIN>'const b2UrlPath = '/file/<B2_BUCKET_NAME>/'let b2Headers = new Headers(request.headers)const url = new URL(request.url)if (url.host === b2Domain && !url.pathname.startsWith(b2UrlPath)) {url.pathname = b2UrlPath + url.pathname;}b2Headers.append("Authorization", authToken)modRequest = new Request(url, {method: request.method,headers: b2Headers})const response = await fetch(modRequest)return response
}
"""workerCode = workerTemplate.replace('<B2_DOWNLOAD_TOKEN>', bDownAuToken)
workerCode = workerCode.replace('<B2_BUCKET_NAME>', B2_BUCKET_NAME)
workerCode = workerCode.replace('<B2_DOMAIN>', B2_DOMAIN)cfHeaders = {'Authorization': "Bearer " + CF_WORKER_API_KEY,'Content-Type': 'application/javascript'}cfUrl = 'https://api.cloudflare.com/client/v4/accounts/' + CF_WORKER_ACCOUNT_ID + "/workers/scripts/" + CF_WORKER_NAMEresp = requests.put(cfUrl, headers=cfHeaders, data=workerCode)if flagDebug:print(resp)print(resp.headers)print(resp.content)
"""workerCode = workerTemplate.replace('<B2_DOWNLOAD_TOKEN>', bDownAuToken)
workerCode = workerCode.replace('<B2_BUCKET_NAME>', b2BucketName)cfHeaders = {'Authorization': "Bearer " + cfWorkerApiKey,'Content-Type': 'application/javascript'}cfUrl = 'https://api.cloudflare.com/client/v4/accounts/' + cfWorkerAccountId + "/workers/scripts/" + cfWorkerNameresp = requests.put(cfUrl, headers=cfHeaders, data=workerCode)if flagDebug:print(resp)print(resp.headers)print(resp.content)print("_______________")
设置敏感变量
通过crontab设置脚本定时执行

将脚本文件 update_cloudflare_worker.py(随便取什么名字都行)放到测试服务器cron脚本目录(这个可以直接通过crontab -l 看看其他脚本都放在哪)下

cd /home/ubuntu/test_crontab
vim update_cloudflare_worker.py
# 把脚本粘贴进去,保存退出
crontab -l
crontab -e
# 在下方添加一行
* * * * *	python3 /home/ubuntu/test_crontab/update_cloudflare_worker.py
# 保存退出

测试

访问图片url,查看 response header 中的 CF-Cache-Status,若为 HIT,则OK

设置完成,再次访问两次图片,CF-Cache-Status 显示为 MISS(第一次访问,回源站取内容) 和 HIT(使用缓存),配置完成

参考链接

public bucket

https://help.backblaze.com/hc/en-us/articles/217666928-Using-Backblaze-B2-with-the-Cloudflare-CDN

private bucket

https://help.backblaze.com/hc/en-us/articles/360010017893-How-to-allow-Cloudflare-to-fetch-content-from-a-Backblaze-B2-private-bucket

去除链接中间的/file//

https://www.reddit.com/r/backblaze/comments/i3t104/using_cloudflarebackblaze_b2_can_i_remove/

https://jross.me/free-personal-image-hosting-with-backblaze-b2-and-cloudflare-workers/

国内教程

https://dukeluo.me/2020/02/12/blog-clean-plan-1.html

https://www.wangfuchao.com/1290/

这篇关于backblaze_cloudflare 图床配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742986

相关文章

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

Spring中配置ContextLoaderListener方式

《Spring中配置ContextLoaderListener方式》:本文主要介绍Spring中配置ContextLoaderListener方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录Spring中配置ContextLoaderLishttp://www.chinasem.cntene

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一