图片到底存哪:从对象存储的念头回到自建目录

工程化与部署

上传的图片以前放在服务器本地的 uploads 目录,跟着 Docker 卷走。文章多了之后我开始想换对象存储,研究了一轮,最后没换。

算的账是这样的:图片存本地,成本是磁盘和带宽——磁盘几十 G 才几十块,带宽包含在服务器里。对象存储按存储量加请求数加下行流量计,理论上更便宜,而且自带 CDN、图片处理(缩放、转格式)这些功能。

让我犹豫的是三件事。

流量费。我的图片是从页面里直接引用的,走对象存储的外网下行要单独计费,而服务器带宽是包月的。以我这个访问量,后者划算得多。

迁移成本。换存储意味着上传逻辑、访问 URL、历史文件三处都要动,还要处理"一部分在本地、一部分在云上"的中间状态。

厂商锁定。这个理由听起来虚,但把 URL 写进数据库之后,换供应商就是批量改数据。

所以我做了一个便宜得多的决定:把存储层抽象出来,业务代码只调 save(buffer, mime) 和 url(key),具体落在哪由配置决定。目录实现先跑着,将来真要换,改的是这一个类。

配套改的一件事是访问路径。以前上传接口返回的是绝对 URL,写进数据库。现在返回 /uploads/xxx.png 这种相对路径,域名由前端根据站点设置拼。这样换域名、上 CDN、甚至换存储,都不用动库里的数据。

这个改动比换存储本身有用得多。

相关阅读