对于站长来说,图片托管一直是一个绕不开的问题。直接用服务器存图片,带宽和存储成本不低;用第三方图床,又担心跑路或限制。今天介绍一个在Hacker News上被反复推荐的方案:Backblaze B2 + Cloudflare Workers,可以实现接近零成本的图片托管。
方案原理
这个方案的核心是利用两个服务的免费额度和互补特性:
- Backblaze B2:对象存储服务,类似AWS S3,但价格便宜得多。免费额度包括10GB存储和每天2500次下载(Class B)
- Cloudflare Workers:边缘计算平台。免费额度包括每天10万次请求,而且Cloudflare到Backblaze的流量不收费(通过Bandwidth Alliance)
简单来说:图片存在Backblaze B2里,通过Cloudflare Workers代理访问,流量几乎免费。
搭建步骤
第一步:注册Backblaze B2
- 访问 Backblaze官网,注册账号
- 创建一个Bucket(存储桶),名称随意,建议设置为Public方便访问
- 在App Keys页面创建一个Application Key,记录下
keyID和applicationKey
第二步:上传图片
可以通过Backblaze网页端上传,也可以用CLI工具:
# 安装B2 CLI
pip install b2
# 登录
b2 authorize-account <keyID> <applicationKey>
# 上传文件
b2 upload-file <bucket-name> ./image.jpg image.jpg
上传后,图片会有一个类似这样的URL:
https://f000.backblazeb2.com/file/bucket-name/image.jpg
第三步:配置Cloudflare Workers
这是实现免费流量的关键。Cloudflare和Backblaze之间有Bandwidth Alliance协议,两者之间的数据传输完全免费。
- 将你的域名添加到Cloudflare
- 创建一个Worker,代码如下:
export default {
async fetch(request) {
const url = new URL(request.url);
const b2Bucket = 'your-bucket-name';
const b2Url = `https://f000.backblazeb2.com/file/${b2Bucket}${url.pathname}`;
// 从B2获取图片
const response = await fetch(b2Url, {
headers: request.headers
});
// 返回图片,加上缓存头
const newResponse = new Response(response.body, response);
newResponse.headers.set('Cache-Control', 'public, max-age=31536000');
newResponse.headers.set('CDN-Cache-Control', 'max-age=31536000');
return newResponse;
}
}
第四步:配置路由
在Worker的Settings中添加路由,将图片请求转发到Worker:
img.yourdomain.com/*
配置完成后,你的图片可以通过以下URL访问:
https://img.yourdomain.com/image.jpg
成本分析
| 项目 | Backblaze B2免费额度 | Cloudflare免费额度 |
|---|---|---|
| 存储 | 10GB | — |
| 下载(Class B) | 每天2500次 | — |
| 上传(Class C) | 每天2500次 | — |
| 请求数 | — | 每天10万次 |
| 流量 | 与Cloudflare之间免费 | 无限(对B2免费) |
对于中小型个人网站来说,这个免费额度完全够用。超出免费额度后,Backblaze B2的价格也比AWS S3便宜很多:存储$0.005/GB/月,下载$0.01/GB。
适合谁
- 个人博客/小站:图片不多,免费额度完全够用
- 开源项目文档:README和文档中的图片托管
- 小型电商/作品集:产品图、作品展示图
- 需要自定义域名图床的站长:不想依赖第三方图床域名
注意事项
- Backblaze B2的免费额度是每天计算的,不是每月。如果某天流量暴增,超出部分按量计费
- 建议给Worker加上防盗链逻辑,防止其他人盗用你的图床
- 重要图片建议做好备份,不要把所有鸡蛋放在一个篮子里
- 国内访问Backblaze的速度一般,如果主要面向国内用户,可以考虑加一层国内CDN
- Cloudflare Workers免费版有CPU时间限制(每次请求10ms),对于简单的图片代理足够了
本文参考来源:Free Personal Image Hosting with Backblaze B2 and Cloudflare Workers | Hacker News讨论
© 版权声明
THE END














暂无评论内容