通过Cloudflare CDN传递私有的Backblaze B2内容

Backblaze B2价格在中大厂中属于很有竞争力的,从Cloudflare走流量的话没有流量费用(是完全不计入流量)

使用Cloudflare Workers代理Backblaze B2私有桶的流量能完全防止盗刷(对于公共存储桶,如果CDN源泄露就有可能被盗刷),同时文件缓存在Cloudflare CDN中.

使用这种方法之后和Cloudflare R2对比:

B2价格便宜,但是Cloudflare Worker有免费的请求次数限制,一天10w次(对一般人来说根本用不完,量大的话开个5美元一个月的付费Workers计划附带1000w次)

以下是Backblaze的文档翻译成中文,另外补充一些我自己的理解.

通过Cloudflare CDN传递私有的Backblaze B2内容

简介

Cloudflare Workers 使得无服务器函数能够尽可能靠近终端用户运行。想了解更多关于如何将 Cloudflare Workers 与 Backblaze B2 云存储帐户结合使用的信息,请点击这里

您可以使用 Cloudflare Workers 来从一个私有的 Backblaze B2 云存储桶中提供数据。若要允许 Cloudflare 从公共 Backblaze B2 存储桶获取内容,请点击这里

您可以使用 Backblaze B2 为您的网站托管静态数据(例如,压缩后的 Javascript 应用程序或多小时的8K视频),并确保数据的安全性、可靠性和经济性。为了保证性能和可用性,一个解决方案是通过CDN(内容分发网络)如 Cloudflare 传输请求。通过利用 Cloudflare 的性能和 Backblaze B2 与 Cloudflare 之间的免费数据传输,您可以显著提升网站表现。

CDN 功能

Cloudflare 使用 DNS(域名系统)来确保内容请求能够到达 Cloudflare 的服务器。通过缓存和专用的高速链路,Cloudflare 确保了存储的高可用性和可靠性。网站的域名在 Cloudflare 进行注册(并从其域名注册商处转移),从而使 Cloudflare 负责从该域名服务内容。在幕后,Cloudflare 允许网站的域名别名指向其他域名,使得用户能够从例如 https://www.coffeemaniacs.com 访问图片和内容,而这些图片和内容实际上是从 Backblaze B2 提供的(例如,https://f345.backblazeb2.com/file/coffemaniacs-storage)。

私有的 Backblaze 存储桶

尽管所有存储桶都可以通过互联网进行寻址,但只有公共存储桶可以被任何人访问。默认情况下,Backblaze B2 存储是私有的,这意味着访问需要身份验证。Backblaze 的各种集成合作伙伴将此安全性集成到他们的工具中,以尽可能保持 Backblaze B2 的用户友好性,同时保证安全性。

从安全存储桶获取网站内容

结合这些元素,意味着您可以通过您的网站提供数据,并将您的照片、视频和所有数字内容存储在一个私有存储桶中,仅通过您的网站访问。直接托管网站时,添加从 Backblaze B2 获取数据所需的身份验证相对简单。而通过 Cloudflare 前置网站则稍微复杂一些,因为 Cloudflare 需要访问私有存储桶以获取和缓存数据,这意味着 Cloudflare 必须对其向 Backblaze B2 发出的请求进行身份验证。

准备工作

在开始之前,请完成以下任务:

  1. 注册一个 Cloudflare Workers 帐户。您可以免费将 Workers 发布到默认的 *.workers.dev 子域,或者可以将 Workers 发布到您自己的付费域。

  2. 安装并配置 Workers 的命令行界面(CLI)工具 wrangler

启用 Backblaze B2

开始前注意,注册Backblaze时的区域不能被改变,按理来说对于大陆用户选择US West最近,不过也只影响回源,缓存了之后就看Cloudflare了.

Backblaze B2的网站

前提条件

您必须拥有一个 Backblaze B2 云存储帐户。如果您已经有一个 Backblaze 帐户,并且左侧导航菜单中包含 B2 云存储部分,则表示您的帐户已经启用了 Backblaze B2。

启用步骤

  1. 登录到 Backblaze 网络控制台。

  2. 在页面右上角的用户菜单中,选择“我的设置”。

  3. 在“已启用产品”下,选中“启用 B2 云存储”复选框。

  4. 查看条款和条件,并点击“确定”以接受。

Backblaze的网站中文翻译实在垃圾,建议在右下角选择英文,后面的操作我也改成英文.

创建一个存储桶

  1. 登录到 Backblaze 网络控制台。

  2. 在左侧导航菜单的 B2 云存储部分下,点击“存储桶”(Buckets)。

  3. 点击“创建存储桶”(Create a Bucket)。

  4. 输入存储桶名称(Bucket Unique Name)。存储桶名称必须至少包含六个字符,并且在全球范围内唯一。

  • 如果您的存储桶名称已被使用,系统会显示提示信息。
  1. 选择隐私设置:私有(Private)或公共(Public)。存储在私有存储桶中的文件需要身份验证才能执行操作,例如下载。公共存储桶不需要身份验证,因此您可以轻松共享文件。您可以随时更改存储桶的隐私设置。

  2. 如果适用,启用 Backblaze B2 服务端加密密钥(Default Encryption)。

  3. 启用对象锁定(Object Lock),以限制文件在指定时间段内被修改或删除。

  4. 点击“创建存储桶”(Create a Bucket),并复制“端点”(Endpoint)字段中的值;您可能稍后需要此值。

  5. 点击“生命周期设置”(Lifecycle Settings)以控制新存储桶中文件的保留时间。

首先隐私设置选择私有

加密和锁定我选择不加密和不锁定(Disable),加密我记得可能有额外操作次数的消耗,另外也肯定对性能有负面影响.

生命周期设置我选择Keep only the last version of the file,这样更加符合一般对于硬盘的直觉,并且最小化支出.

注意事项

如果这是您第一次创建公共存储桶,请完成以下任务以确保您有正确的权限创建公共存储桶:

  1. 验证您的电子邮件地址。

  2. 保留付款记录,或者使用信用卡表单支付一小笔费用,这笔费用将记入您的帐户余额。

创建应用密钥

应用密钥控制对您的 Backblaze B2 云存储帐户及其中包含的存储桶的访问。

步骤

  1. 登录到 Backblaze 网络控制台。

  2. 在左侧导航菜单的 B2 云存储部分下,点击“应用密钥”(Application Keys)。

  3. 点击“添加新应用密钥”(Add Application Key),并输入应用密钥名称(Name of Key)。

  • 您无法通过此名称搜索应用密钥,因此应用密钥名称不需要全球唯一。
  1. 在“允许访问存储桶”(Allow access to Bucket(s))下拉菜单中选择“所有”或特定的存储桶。

  2. 可选:选择您的访问类型(Type of Access)(读写、只读或只写)。

  3. 可选:选中“允许列出所有存储桶名称”(Allow List All Bucket Names)复选框(b2_list_buckets 和 S3 兼容 API 的 S3 列出存储桶操作所必需)。

  4. 可选:输入文件名前缀(File name prefix)以限制应用密钥访问仅限于具有该前缀的文件。根据您在步骤4中的选择,此操作将应用密钥访问限制在所有存储桶或仅选定的存储桶中的指定前缀的文件。

  5. 可选:输入一个正整数,以限制应用密钥在到期前的时间(Duration (seconds))(以秒为单位)。该值必须少于1000天(以秒为单位)。

  6. 点击“创建新密钥”,并记录生成的 keyID 和 applicationKey 值。

这里我因为我设置个单独的Key给Cloudflare Workers,所以按照最小化权限的原则我只允许访问对应的桶,只允许读,不允许列出所有桶名,剩下两项留空.

注意事项

当您创建一个新的应用密钥时,响应将包含实际的密钥字符串,例如 N2Zug0evLcHDlh_L0Z0AJhiGGdY。您始终可以在此页面找到 keyID,但出于安全考虑,applicationKey 只会出现一次。请确保您将此值复制并安全保存。

创建一个 Cloudflare Worker

Backblaze B2 GitHub 存储库包含了 Cloudflare Workers 的完整源代码和配置详细信息。

步骤

  1. 使用 Backblaze 存储库作为您自己的 Worker 的模板,在 Workers CLI 中启动一个项目。

  2. 运行以下命令,将 Worker 名称(示例中为 my-proxy)更改为您的项目名称:


wrangler generate my-proxy https://github.com/backblaze-b2-samples/cloudflare-b2

cd my-proxy

配置您的 Cloudflare Worker

前提条件

在您的 Backblaze B2 帐户中创建一个私有存储桶。如果您要使用的存储桶是公共的,请不要更改此设置,直到您设置好 Worker。

编辑配置文件

编辑 wrangler.toml 文件,在其中添加一个 [vars] 部分,并填入您的应用密钥 ID 和端点:


[vars]

B2_APPLICATION_KEY_ID = ""

B2_ENDPOINT = ""

BUCKET_NAME = ""

ALLOW_LIST_BUCKET = ""

填入存储桶名称

使用以下选项之一输入您的存储桶名称:

  • 若要将所有传入请求定向到指定的存储桶,请使用格式 acme-images

  • 若要将传入 URL 路径的初始段作为存储桶名称,请输入 $path,例如:

https://images.acme.com/acme-images/logos/acme.png

  • 注意:如果您使用默认的 *.workers.dev 子域,请在配置中指定存储桶名称,或者将 BUCKET_NAME 设置为 $path 并在路径中传递存储桶名称。

  • 若要将传入 URL 主机名中的初始子域作为存储桶名称,请输入 $host,例如:

https://acme-images.images.acme.com/logos/acme.png

  • 注意:如果您将 BUCKET_NAME 设置为 $host,请为 Workers 需要访问的每个存储桶名称配置路由或自定义域。您不能将 *.acme.com/* 路由到您的 Workers。

设置 ALLOW_LIST_BUCKET 变量

ALLOW_LIST_BUCKET 变量设置为 true 或 false。Backblaze B2 存储桶,即使是公共的,也不允许匿名客户端列出存储桶中的对象。将 ALLOW_LIST_BUCKET 变量设置为 true 以允许此功能。设置为 false 则拒绝此功能。在大多数情况下,您应该将 ALLOW_LIST_BUCKET 设置为 false。

来自Github带注释的配置文件


[vars]

B2_APPLICATION_KEY_ID = "<您的 B2 应用密钥 ID>"

B2_ENDPOINT = "<您的 S3 端点 - 例如:s3.us-west-001.backblazeb2.com>"

# 设置 BUCKET_NAME 为以下之一:

# "一个 Backblaze B2 存储桶名称" - 将所有请求直接定向到指定的存储桶

# "$path" - 使用传入 URL 路径中的初始段作为存储桶名称

# 例如:https://images.example.com/bucket-name/path/to/object.png

# "$host" - 使用主机名中的初始子域作为存储桶名称

# 例如:https://bucket-name.images.example.com/path/to/object.png

BUCKET_NAME = "$path"

# 具有公共读取可见性的 Backblaze B2 存储桶不允许匿名客户端列出存储桶的对象。

# 您可以在 Worker 中通过 ALLOW_LIST_BUCKET 允许或拒绝此功能。

ALLOW_LIST_BUCKET = "<如果您希望允许客户端列出对象,请设置为 true,否则设置为 false>"

# 如果设置了 ALLOWED_HEADERS,这些头将包含在已签名的上游请求中,

# 与 AWS v4 签名所需的最小头集一起:

# "authorization", "x-amz-content-sha256" 和 "x-amz-date"。

#

# 请注意,如果 ALLOWED_HEADERS 中未包含 "x-amz-content-sha256",

# 则传入请求中提供的任何值都将被丢弃,

# 而 "x-amz-content-sha256" 将设置为 "UNSIGNED-PAYLOAD"。

#

# 如果您设置了 ALLOWED_HEADERS,则您有责任确保

# 您指定的头列表支持您的客户端应用程序所使用的功能,例如 "range"。

# 以下列表是一个建议的起点。

#

# 请注意,HTTP 头不区分大小写。"host" 可以匹配 "host"、"Host" 和 "HOST"。

#ALLOWED_HEADERS = [

# "content-type",

# "date",

# "host",

# "if-match",

# "if-modified-since",

# "if-none-match",

# "if-unmodified-since",

# "range",

# "x-amz-content-sha256",

# "x-amz-date",

# "x-amz-server-side-encryption-customer-algorithm",

# "x-amz-server-side-encryption-customer-key",

# "x-amz-server-side-encryption-customer-key-md5"

#]

我的设置:B2_APPLICATION_KEY_ID/B2_ENDPOINT/BUCKET_NAME(为对应需要映射的桶名)其他留空

这样这个Worker直接对应这个桶

发布 Workers 项目

运行以下命令将 Workers 项目发布到 Cloudflare Workers 环境:


wrangler publish

部署您的 Worker

  1. 登录到您的 Cloudflare 仪表板,并导航到您的新 Worker。

  2. 点击“设置”,点击“变量”,然后点击“编辑变量”。

  3. 添加一个名为 B2_APPLICATION_KEY 的变量,并将您的 Backblaze B2 应用密钥作为值输入。

  • Backblaze 建议您在此处设置您的 Backblaze B2 应用密钥,而不是在 wrangler.toml 文件中。

  • 您不应将 API 密钥、密码和其他敏感数据保存在源代码文件中,以防这些文件在私人或公共存储库中共享。

  1. 点击“加密”,然后点击“保存并部署”。

环境变量应如下例所示:

更新您的网页

您需要更新代码以引用您的 Cloudflare Worker 而不是 Backblaze B2 存储桶。例如,将所有 acme-images.s3.us-west-001.backblazeb2.com 的引用替换为 images.acme.com

设置存储桶信息

由于存储桶是私有的,Cloudflare Worker 使用应用密钥对每个向 Backblaze B2 的请求进行签名,并将签名包含在请求的授权 HTTP 头中。默认情况下,当请求包含授权头时,Cloudflare 不会缓存内容。因此,您必须将存储桶的信息设置为包含一个 cache-control 指令。

步骤

  1. 登录到您的 Backblaze 帐户。

  2. 在左侧导航菜单的 B2 云存储部分下,点击“存储桶”(Buckets)。

  3. 在列表中找到您的存储桶,然后点击“存储桶设置”(Bucket Settings)。

  4. 在“存储桶信息”(Bucket Info)字段中输入 {"Cache-Control":"public"}

  • 可选:设置额外的 cache-control 指令,例如,为指示 Cloudflare 将每个文件缓存一天,输入 {"Cache-Control": "public, max-age=86400"}
  1. 点击“更新存储桶”(Update Bucket)。

另外如果你不需要CDN的缓存功能,比如你的文件会频繁变化,可以不设置这里,这样Worker仅仅作为一个代理.

设置存储桶可见性

  1. 验证您可以使用 Worker 访问您的内容。例如,在浏览器中打开形如 https://images.acme.com/logos/acme.png 的 URL。

  2. 将公共存储桶的可见性更改为私有。

  3. 验证您的内容不再可以直接从 Backblaze B2 访问。例如,您不应再能够访问形如 https://acme-images.s3.us-west-001.backblazeb2.com/logos/acme.png 的 URL。

现在,终端用户不能再直接从 Backblaze B2 访问您的内容。

另外在Caps & Alerts中可以设置各项支出的限额

上传属于Class C操作,价格为2500次/0.01美元,下载(在这里应该是回源)属于Class B操作,价格为25000次/0.01美元,下载带宽可以设为0永绝后患.

13 个赞

感谢分享!!

感谢分享

感谢大佬

感谢佬,学习一下

Cloudflare + Backblaze私有桶 实现免费的图床 | king (freekj.me) 以前看到过一篇这个,感觉清晰点 :joy:

3 个赞

From 配置调优 to 开发调优

mark一下