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

相关文章

IDEA中配置Tomcat全过程

《IDEA中配置Tomcat全过程》文章介绍了在IDEA中配置Tomcat的六步流程,包括添加服务器、配置部署选项、设置应用服务器及启动,并提及Maven依赖可能因约定大于配置导致问题,需检查依赖版本... 目录第一步第二步第三步第四步第五步第六步总结第一步选择这个方框第二步选择+号,找到Tomca

Win10安装Maven与环境变量配置过程

《Win10安装Maven与环境变量配置过程》本文介绍Maven的安装与配置方法,涵盖下载、环境变量设置、本地仓库及镜像配置,指导如何在IDEA中正确配置Maven,适用于Java及其他语言项目的构建... 目录Maven 是什么?一、下载二、安装三、配置环境四、验证测试五、配置本地仓库六、配置国内镜像地址

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Redis MCP 安装与配置指南

《RedisMCP安装与配置指南》本文将详细介绍如何安装和配置RedisMCP,包括快速启动、源码安装、Docker安装、以及相关的配置参数和环境变量设置,感兴趣的朋友一起看看吧... 目录一、Redis MCP 简介二、安www.chinasem.cn装 Redis MCP 服务2.1 快速启动(推荐)2.

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例