Anon May the code also cure you.

自建图床

2019-05-13
Anon

随着文章的数目变多,博客的加载速度变得越来越慢尤其是主页需要显示每篇文章开头被截取到的图片的时候。所以,是时候考虑一下图床的问题了。


背景

在此之前,我其实一直都是在“蹭”Github的存储功能——自建了一个专门用于存放静态资源的仓库,每次都通过Download按钮获取外链。

一开始的时候效果不错,毕竟不需要付费。但是还是有很多直接暴露出来的问题,比如是否违反用户协定(虽然管理员好像有声明过这并不属于abuse,并且官方也提供Download按钮),速度慢,RawGit今年十月将停止服务。

不过这些都不是真正的问题,真正的问题是:如果基于Repo的存储必须持有整个仓库才能进行数据的维护而如果基于Issue的存储则难以实现不同静态文件对应不同文件夹的管理,并且可能会涉及abuse问题。

环境

在选择并实施新的解决方案之前,首先需要分析一下我自己的(博客)生产环境以及对图床服务的相关需求。

  • 主要在PC上处理图片素材,PC大概一个月关机一次。
  • 在PC上书写博客较多,在MBP上一般书写的是即兴突然来灵感之类的内容。两者有上传图片的需求,MBP上的图片主要是引用外部资源。

对于图床服务(其实我更愿意描述成静态文件存储服务),我的需求或许会严格一些。

  • 服务可以挂,数据不能丢,丢了写的所有的文章都报废。
  • 服务重置后,文章中的引用链接尽可能的不要变化。(静态资源外链的值需要是可以被预期的,甚至可以被设置的。这样最大的好处就在于,当服务重置时上传新的文件数据不需要建立新的映射关系。)
  • 服务尽可能的不要关联到其他操作如域名备案。
  • 服务不容易挂。
  • 价格越低越好。
  • 速度越快越好。

相关服务分析

大体上要实现静态文件存储并提供外链主要有那么几种选择:“蹭“一些大体量的社交软件及相关相册程序、纯粹的图床服务、对象存储(云)服务、基于(实体、云、虚拟)主机自建图床。

社交软件

如微博(针对外链启用了相关屏蔽),imgur等。

最大好处就是快,它比你更想让数据更快地输出到用户的浏览器中免费良好的抗攻击性,毕竟它是实际的为用户提供服务的应用程序。当然坏处也很明显:

  • 服务本身的不稳定性(不影响数据)
    • 例如发布在微博的静态资源已经开启了防外链功能,你需要付出一定的成本(设置Http Header等),才能让它在如期显示在你的站点上。
    • 随时它都可能更换资源的URL。
  • 数据本身的不安全性。
    • 本身就没有购买相关服务许可,这意味着你的行为(大量no-sense的数据)可能构成abuse,除非它在协议中有相关的允诺(不过我想不到他有什么理由无偿地允诺),那么你的数据随时可能被删除。
    • 你的数据将被公开给公众,经过程序合适的推荐算法,任何人都能通过Web甚至在主页看到它。你的无意义的数据或许会触犯某些相关条例,又或许被用户举报最后依旧有被删除的风险。
    • 前两者讨论的仅仅是社交程序本身基于其个体利益对你数据的审查。
  • 和绝大多数图床服务的弊病一样,文件管理功能几乎没有。你无法快速的通过你的博客名定位到一系列相关资源的所在;同时一旦服务停止、社交软件中的数据被清除或篡改,通过备份文件重新上传后的链接又将是全新的,这意味着你得逐一匹配文章中引用过的图片并修改他们的URL。

图床服务

sm.ms,相比于社交软件则更加直接;也有更人性化的用户界面;同时服务本身的稳定性相较于社交软件会大很多,不存在”盗链”这一概念。缺点:

  • 部分(免费)图床服务只可上传文件不可管理(删除),甚至直接地查看自己一共上传了那些图片。
  • 图床服务一般只有小的公司或者个体组织维护,可靠性存在问题,可能随时因为审查或是自身原因停止服务。
  • 上文所述的无法快速定位,需要自建映射。

我认为图床服务本身相比于盗链是更靠谱的选择,它适用于一些临时的,不重要的行为例如在论坛里展示大量的图片。

对象存储

对象存储相比于前面两者就靠谱专业很多很多了,毕竟是付费服务并且云服务也只有体量巨大的那么几个公司才玩的好(他们能把成本压低垄断市场)。下面主要说说我体验过的两家对象存储,七牛云和腾讯云。

我不喜欢七牛云,虽然他好像在知乎用户中的口碑很不错。因为他强行地把存储服务和CDN绑定到一起,虽然说提供10G的存储和10G的流量,但是一旦他提供的绑定到CDN的测试域名失效,你的所有数据都像是被扣留在里面了一样。

你能做的,只有乖乖地租用域名备案绑定CDN,开始承担CDN费用。同时如果你使用的是基于Github Pages构建的博客,你还需要负担HTTPS的费用。至于整体的七牛云后台的体验,我也觉得比较用户界面比较劣质(相比于阿里云和腾讯云);再加上我提交工单询问过CDN的问题,得到的回复却是遮遮掩掩、避重就轻,我就决定不再考虑这家提供的服务了。

对象存储一定要配合CDN使用吗?30天后测试域名过期,我没有域名是不是就无法通过浏览器获取对象存储中的内容?

解决方法:

回收测试域名对您的存储资源没有影响,不会删除您的资源,也不需要重新上传资源。

您绑定自定义域名后,通过自定义域名访问即可。

如果您的域名已经在工信部备案,请参考域名绑定教程:https://developer.qiniu.com/kodo/kb/5158/how-to-transition-from-test-domain-name-to-a-custom-domain-name

如果您需要了解测试域名的使用规范请参考:https://developer.qiniu.com/fusion/kb/1319/test-domain-access-restriction-rules

-————————————-

Q:部分资源可以访问,新资源无法访问。

A:旧资源可以访问是因为cdn缓存未失效,您刷新cdn缓存后现象会保持一致。

七牛云还有一个不好的地方,就是他的存储内容管理比较劣质,他是使用手动添加前缀字符串的方式实现而不是直接的使用文件夹管理的方式来实现资源的管理的。这意味着,所有的资源都将冗杂地平铺在一个Bucket里面,而不是有目录的树级显示。

相比之下腾讯云就显得可靠很多了(虽然他的用户界面依旧不及阿里云),虽然没有永久的免费政策(提供了6个月免费政策)。但是总体上就直截了当很多,哪里有需要付费的地方都说的很明白绝不藏着掖着。

同时,相比于七牛云他在两个方面都是完胜的。首先它并不需要CDN就能提供下载外链(基于腾讯云本身的域名),再者他支持传统云存储服务一般的文件夹管理模式,这意味着一旦弃用腾讯云或者腾讯云服务失效后博客本身可以基本上不需要变动。

自建图床

所以如果自建图床不能提供更优秀的特性,我应该会选择腾讯云的对象存储服务。于是,我开始了我的自建图床之旅。

我要考虑的问题无非那么几点:

  • 是否需要使用CDN?
  • 怎么样操作能比云存储更方便?
  • 或许自实现抗攻击是极难的,那被攻击后如何快速恢复服务?

这个时候我首先想到的是科学上网的VPS,它的下行带宽足够的大(至少够我个人使用),我不再需要支付额外的费用。当初要不是我觉得Github Pages可以稳定免费的提供静态网站的托管并且抗攻击的问题不再需要我考虑,或许我会把博客直接部署在它上面。

那下面两个需求如何实现呢? 就需要引入下一个我想说的话题,Goodsync。

GoodSync

关于备份,有两个极优秀的软件我不得不提——Macrium Reflect 和 GoodSync。如果说Macrium为我提供了整套的系统以及磁盘备份的解决方案,那么GoodSync可以说是只要有正在运行的系统(他也可以运行在U盘里)存在,它可以解决任何的备份、同步、传输需求

它支持任意(可以非本机,可以在内网,可以是云存储)文件夹到任意文件夹备份同步

同时它还支持自动执行同步、备份功能,通过检测文件夹的变动,所以它可以满足我上述的两个需求。

如何自建图床

  1. VPS开启Http Server(Apache、Nginx等),并确保它能通过你预期的URL返回资源目录中的文件。
  2. 对于非主要上传资源的设备,直接通过FileZilla等FTP程序上传资源。
  3. 在主要可能会上传资源的设备(我的是MBP和PC)建立一个静态资源文件夹和一个备份文件夹。每次需要将资源上传到图床时,只需要将资源拖入静态资源文件夹的相关目录中(如图,Blog为每片博文持有的资源的总目录,Set则是一个共享用的静态资源的无序集目录)。每次上传资源只需要将图片拖入即可。

  4. 在GoodSync中建立同步任务将本地的静态资源文件夹与VPS的静态资源文件夹同步,同时建立备份任务将本地的静态资源文件夹增量备份(取消触发删除)到备份文件夹,两个任务都设置定期执行。
  5. 当VPS被攻击或出现异常时,只需将本地的备份文件夹内的数据覆盖回静态资源文件夹,并确保域名一致即可。
  6. 修改_config.yml给静态资源域名设置一个宏。



评论

Content