写博客、发文章、做电商,都绕不开图片。图片放哪,直接决定了三件事:访问快不快、花不花钱、哪天服务商跑路了你还在不在。
这篇讲清楚 VPS 用户做图床的三条路,以及怎么选。如果你手上已经有一台 VPS 在跑网站,这篇能帮你判断"要不要单独搞个图床"以及"搞哪种"。
"图床"这个词被用得很杂,其实对应三类完全不同的需求:
| 你的情况 | 该选 |
|---|---|
| 博客配图,一年几百张 | 对象存储,别自己搭程序 |
| 想做图片分享站,要让别人上传 | 图床程序(Chevereto / Lychee) |
| 手机相册自动备份 | Immich,那是另一回事 |
关键判断:你是在"托管自己的图片",还是在"运营一个图片服务"。
前者(绝大多数人)要的只是一个稳定、便宜、不会被墙的存储位置。搭一套图床程序是杀鸡用牛刀 —— 你要额外维护 PHP 或 Docker、数据库、备份、升级,而这些跟"让图片能显示"没有半点关系。
后者才需要程序 —— 要有用户系统、上传界面、相册归类、防盗链这些功能。
核心优势:图片不走你的 VPS 带宽。
这一点很多人没意识到有多重要。图片是流量大头 —— 一篇带十张图的博客文章,一次访问可能就消耗 2-5 MB。放在自己 VPS 上,这些流量要占你的月流量额度,超了要么被限速要么被扣费。
对象存储配合 CDN,流量走的是存储服务商和 CDN 的网络,你的 VPS 只负责输出 HTML(几十 KB)。
价格结构上是目前最适合图床的(以下数据取自 Cloudflare 官方定价页):
| 项目 | 免费额度 | 超出后 |
|---|---|---|
| 存储 | 10 GB / 月 | $0.015 / GB-月 |
| A 类操作(写) | 100 万次 / 月 | $4.50 / 百万次 |
| B 类操作(读) | 1000 万次 / 月 | $0.36 / 百万次 |
| 出站流量 | 免费 | 免费 |
出站流量免费是最关键的一条。 传统对象存储(比如 S3)的存储很便宜,但流量费很贵 —— 图床这种"写入一次、读取无数次"的场景,流量费会远超存储费。R2 把这块直接免掉了。
10 GB 免费存储什么概念?按一张图 200 KB 算,能放 5 万张。个人博客基本用不完。
用 R2 做图床的流程:
- 在 Cloudflare 建一个 R2 存储桶
- 绑定一个自定义域名(比如
img.example.com) - 本地用工具上传,拿到公开 URL
- 文章里直接引用这个 URL
绑定自定义域名比用 r2.dev 的默认域名好 —— 后者有速率限制,而且不好看。
上传工具:
- PicGo —— 跨平台,支持 R2、S3、GitHub 等多种后端,拖拽上传后自动复制 Markdown 链接。写博客的人用得最多
- rclone —— 命令行,适合批量上传和自动同步,用法见 VPS 文件传输指南
- 直接调 S3 API —— R2 兼容 S3 协议,任何 S3 客户端都能用
第一步:建桶。
在 Cloudflare 控制台进 R2,建一个存储桶。位置选择 Automatic 就行 —— R2 会自动做全球分布,不需要你手动挑区域。
第二步:绑定自定义域名。
这一步是关键,别跳过。在桶的设置里添加自定义域名(比如 img.example.com),然后去 DNS 加一条指向 R2 的记录。
不建议直接用 r2.dev 那个默认域名 —— 它有速率限制,正式站点会撞墙,而且 URL 里带着一长串随机字符。
第三步:建 API 令牌。
在 R2 的「Manage API Tokens」里建一个,权限选 Object Read & Write,并限定到这一个桶。建完会给你:
- Access Key ID
- Secret Access Key
- Endpoint(形如
https://<accountid>.r2.cloudflarestorage.com)
Secret 只在创建时显示一次,当场存进密码管理器。 关掉页面就再也看不到了。
第四步:配置上传工具。
以 PicGo 为例,选 S3 兼容模式,填:
| 字段 | 值 |
|---|---|
| Endpoint | 你的 R2 Endpoint |
| Bucket | 桶名 |
| Access Key / Secret | 上一步拿到的 |
| 自定义域名 | https://img.example.com |
| 存储路径 | 建议按日期分目录,如 {year}/{month}/ |
路径按日期分目录很重要 —— 所有图片平铺在一个目录里,几千张之后在控制台里基本没法找。
第五步:验证。
传一张图,确认:
# 拿到 URL 后测试能否访问,以及响应头里的缓存设置
curl -I https://img.example.com/2026/09/test.png
看到 200 且 content-type 正确就通了。
第六步:配置缓存策略。
在 Cloudflare 的 Cache Rules 里给 img.example.com 加规则:Cache Everything,Edge TTL 设长一点(比如一个月)。
图片内容不会变,缓存越久越好。这也是自定义域名比默认域名好的另一个原因 —— 你可以自由控制缓存规则。
1. 一定要配自定义域名 + CDN。 直接用存储桶的默认域名,一是速度不理想,二是服务商改规则时你没法控制。挂上 Cloudflare 之后全球访问都快,做法见 Cloudflare CDN 加速设置。
2. 图片的 URL 一旦发出去就不能变。 换存储位置意味着所有历史文章的图片全部失效。选之前想清楚,选了就别轻易换。 真换了要做好重定向。
3. 存储费会慢慢涨。 图片只增不减。定期清理没用上的图,或者接受每个月几块钱的成本。
不想依赖第三方,可以在自己的 VPS 上跑 MinIO —— 它是开源的 S3 兼容存储,接口和 R2、S3 一致,将来想换回云上,客户端配置改个 Endpoint 就能迁。
但要先想清楚:自建对象存储解决的是"不想依赖第三方",不解决"省钱"。 图片流量还是要走你的 VPS 带宽,该超还是超。
| Cloudflare R2 | MinIO 自建 | |
|---|---|---|
| 存储成本 | 10 GB 内免费 | 硬盘钱 |
| 流量成本 | 免费 | 占 VPS 流量额度 |
| 运维 | 无 | 要维护服务、备份、升级 |
| 数据控制 | 在 Cloudflare | 完全在自己手上 |
| 异地容灾 | 服务商负责 | 要自己做 |
判断该不该自建,参考 VPS 需要对象存储吗,部署方法见 VPS 部署 MinIO。
适合自建的场景:图片涉密不能放第三方、或者你本来就有一台大带宽大盘鸡闲着(比如年付几十美元、月流量几 TB 的那种,不用白不用)。
需要用户上传、相册管理、防盗链这些功能时,才上程序。
功能最全的老牌图床程序,当前版本 4.5.7(2026 年 8 月),采用 AGPL-3.0 开源协议,另有功能更多的付费 Pro 版。
优点:功能完善(用户系统、相册、API、防盗链、多存储后端)、界面成熟、文档详尽。项目从 2007 年就开始了,稳定性有保证。
缺点:资源占用不低(PHP + MySQL),1G 内存的机器跑起来会紧。而且功能多意味着配置项多,只想放几张图的话会觉得繁琐。
适合:要做图片分享站、或者团队内部需要一个图片管理平台。
当前版本 v7.10.0(2026 年 9 月),MIT 协议,GitHub 上 4.3k star,最近提交就在几天前,维护活跃。
优点:界面漂亮、操作接近原生相册应用、支持原图保存和 EXIF 信息。PHP + SQLite 就能跑,可以不装 MySQL,比 Chevereto 轻得多。
缺点:偏向"个人相册"而不是"对外图床服务",缺少面向公众上传者的一整套用户体系。
适合:个人图片库、摄影作品展示、小团队共享。
国产开源图床,支持多种存储后端(本地、S3、又拍云等)。
但要注意:它的最后一次提交是 2026 年 2 月,已经大半年没有更新了。选它之前想清楚这点 —— 图床程序不更新意味着新的 PHP 版本兼容性问题没人修。
同样是国产方案,GPL-2.0 协议,3.8k star,维护活跃(2026 年 8 月仍有提交)。走的是极简路线 —— 单文件 PHP,上传即用。
适合:只要一个最简单的上传接口,不想折腾数据库和依赖。
选了程序就要接受这些:
- 要维护一套 Web 应用(PHP/Node + 数据库 + 反代 + 证书)
- 要处理上传安全 —— 用户传的文件必须校验类型、限制大小、禁止执行。图片里塞 PHP 代码是经典攻击手法
- 要防盗链,否则别人直接引用你的图,流量全算你的
- 要备份,图片丢了比文章丢了更麻烦
所以除非确实需要"让别人上传",否则用对象存储。
Immich 是这一类的代表 —— 自托管的 Google Photos 替代品,11.5 万 star,活跃度极高。
但它不是图床:它是给手机相册做自动备份的,有 App、有时间线、有人脸识别。你要的是"文章里能引用一个图片 URL",Immich 给不了这个。
想做相册备份,站内有完整教程:VPS 搭建 Immich。
别把这三件事混在一起 —— 见过有人拿 Immich 当图床用,然后发现每张图都要手动找直链地址,效率极低。
除非你的站点只有几十张图且永远不增长,否则不要把图片和网站代码放在同一台机器上。
原因有三:
1. 备份体积暴涨。 网站代码几百 KB,图片几个 GB。每次备份都要把图片一起打包,备份慢、占用大、恢复也慢。分开之后,代码走 git,图片走对象存储各自的备份策略。
2. 迁移服务器时最痛苦。 换 VPS 要传几十 G 图片,慢且容易出错。图片在对象存储的话,换服务器只需要改配置。
3. 流量全压在一台机器上。 见前面说的,图片流量会吃掉你的月度额度。
什么时候可以放本机:图片总量小于 1 GB、站点流量很小、或者你有一个大带宽大盘鸡且不介意迁移麻烦。
不管走哪条路,都要防别人直接引用你的图片 —— 那不是"帮我传播",是实打实消耗你的流量和钱。
Nginx 层做(图片在自建服务器上):
location ~* \.(jpg|jpeg|png|gif|webp|avif)$ {
valid_referers none blocked server_names
*.your-site.com your-site.com;
if ($invalid_referer) {
return 403;
}
expires 30d;
add_header Cache-Control "public, immutable";
}
none blocked 让直接输入 URL 访问(没有 Referer)的请求也能通过 —— 否则用户复制图片链接粘贴到浏览器会看到 403,体验很差。
对象存储层做:R2、S3 都支持 Referer 白名单,在控制台或通过 API 配置。
但防盗链不是万能的 —— Referer 可以伪造,也能被浏览器隐私设置去掉。真正的成本控制靠流量监控告警,见 VPS 流量监控和超额预警。
上传前把图片压好,比换存储方案省得多。
| 做法 | 效果 |
|---|---|
| 转 WebP / AVIF | 比 JPEG 小 25-50% |
| 限制最大宽度 | 文章配图 1200px 够用,别传 4000px 原图 |
| 有损压缩(质量 80) | 肉眼无差别,体积减半 |
| 懒加载 | 首屏之外不加载 |
一张 2 MB 的 PNG 截图,转成 WebP 加压缩后通常只有 150 KB。 十张图的文章从 20 MB 降到 1.5 MB,用户打开速度和你流量的消耗都差一个数量级。
工具选择:
- Squoosh —— 在线工具,浏览器里直接压,适合偶尔用
- ImageMagick / cwebp —— 命令行批量处理
- 构建时自动处理 —— Astro、Next.js 这类框架内置了图片优化,博客类站点最省心
PNG 截图是个例外 —— 它压不动多少。截图类内容考虑转 JPEG 或者用 AVIF,效果反而更好。
| 场景 | 推荐 |
|---|---|
| 个人博客、少量配图 | Cloudflare R2 + PicGo |
| 图片多、要 CDN 加速 | R2 + Cloudflare CDN |
| 不能依赖第三方 | MinIO 自建(有大带宽机器才划算) |
| 要做图片分享站 | Chevereto |
| 个人相册展示 | Lychee |
| 手机相册备份 | Immich |
| 最简上传接口 | EasyImages |
如果你只是想让文章里的图片正常显示、加载快、不占自己带宽 —— 对象存储是唯一答案,别去搭程序。
图床会跑路吗?
第三方免费图床跑路是常态(历史上倒过很多家)。用对象存储就没这个问题 —— 图片在你自己的存储桶里,服务商换了你把文件迁走就行。这也是不建议用免费图床的原因:你无法导出的东西,就不算你的。
图片 URL 能长期有效吗?
对象存储的 URL 只要你不删桶、不改域名,就可以长期有效。所以自定义域名这一步很关键 —— 用服务商默认域名的话,将来换服务商所有链接都会失效。
要不要开图片 CDN?
要。对象存储 + CDN 是标准组合 —— CDN 缓存住热点图片,回源请求大幅减少,访问也更快。Cloudflare 的免费套餐就够用。
自建图床能赚钱吗?
跑广告的图片站很难赚回成本 —— 图片流量费是大头。真要做,先算清楚带宽成本,别做到一半发现流量费比收入高。
图片放国外会不会很慢?
配合 CDN 就不会。R2 + Cloudflare 在国内访问速度尚可(不如国内 CDN,但比裸的国外服务器好很多)。对图片这种静态资源,CDN 的效果尤其明显。
怎么把已有图片迁到对象存储?
# 用 rclone 批量同步
rclone copy /srv/app/uploads/ r2:mybucket/uploads/ --progress
迁完记得批量替换文章里的图片 URL,并且保留旧路径的 301 跳转(如果原来的图片 URL 已经被搜索引擎收录)。
备份怎么办?
对象存储不是备份 —— 误删了桶里的文件就是没了。定期把桶同步到本地或另一个存储:
rclone sync r2:mybucket /backup/r2-mirror/ --progress
原则和 VPS 备份恢复演练 里讲的一样:异地、多份、演练过恢复。
图片该用什么格式?
- 照片 → WebP 或 AVIF
- 截图、图标、需要透明的 → PNG(压不动就考虑 AVIF)
- 动图 → WebP 或 MP4(GIF 体积太大)
兼容性上 WebP 现在全平台支持了,可以放心用。
要不要给图片加域名前缀?
要,用独立域名(img.example.com)而不是主域名路径(example.com/img/)。独立域名的好处是:换存储时只改 DNS,不用改文章内容。
- VPS 需要对象存储吗 — 什么文件该放对象存储
- VPS 部署 MinIO 对象存储 — 自建 S3 兼容存储
- Cloudflare CDN 加速设置 — 图片走 CDN 的完整配置
- VPS 文件传输指南 — 用 rclone 批量同步图片
- VPS 备份恢复演练怎么做 — 对象存储里的图片也要备份
