前一阵有个老哥开发了聚合图床 superbed.cn,大致原理就是把同一张图片分发到不同图床,确保文件安全可靠,外链时自动读取可用节点。设计思路很不错,但我分析后觉得这玩意根本不可行,原因会在下面解释。
我假想的环境是大流量网站,每日上传图片数千张,图床参考:https://assbbs.com/thread-20391.htm
上传环节
大部分图床在上传上都会做限制的,比如SM.MS限制单IP每小时只能传10张,新浪微博普通用户也有发表频率限制。
服务器中转
现在聚合图床用的就是这种方法,即用户先上传到中转服务器,服务器再模拟用户进行上传。优点是速度较快,不存在用户与海外图床对接的连通性考虑。有很大的一个缺点就是所有上传都是通过服务器IP进行的,如果图床有限制就会出现失败。而且如果有人上传敏感图片,被图床连坐式上传,那所有通过此IP上传的图片都会被清理,完全没有安全性。对此聚合图床采取的方案是在中转服务器进行智能鉴黄,确保输出的图片是“洗白”的。看起来似乎解决了一定问题,但仍然不能确保中转服务器流量过大被图床黑名单的可能。
AJAX+跨域
这种方法是在客户端进行的,即使用访客的IP进行上传。可以确保用户以其自主身份上传,不走中转服务器所以也不会造成共用身份,但是这种方式必须图床支持。据我整理过所有的图床里,国内只有SM.MS支持跨域,但是他们有单IP数量限制。国外的只发现vgy.me一家,服务器在英国,国内上传速度奇慢无比。总体来说这种方法对于聚合图床根本不可行,还是需要服务器中转,然而服务器中转也有很多问题,所以上传环境可谓步步惊心。
国外图床外链
国外图床有两大致命弱点,一是速度慢,大部分图床都没有CDN,而是单一地区服务器。有的最多也就Cloudflare免费版,到国内速度也不好的。二是国外网址随时可能被墙,到时也没法使用了。
架设输出CDN
就是外链地址(例如superbed.cn/1.jpg)并不是直接跳转到图床相应图片地址,而是由聚合图床自己的服务器进行缓存,然后走CDN输出。这个可以解决图片加载过慢问题,而且备案后可以保证不被墙。但是问题是需要花费较大开销来维护CDN,甚至花销跟自建图床不相上下。比较省钱的办法是用Cloudflare进行缓存,就是每次服务器下载后伪装成永久储存的静态图片(实际只是一个缓存),外面套一层Cloudflare让它帮着服务器缓存,图床相当于只是一个冗余存储的作用,节省聚合图床的硬盘空间。这个方法看似可行,但Cloudflare免费班和20刀专业版也不会做公益帮忙缓存大量图片,到达几G值以后较旧的图片就会被清理,造成了频繁回源,给中转服务器造成的压力也是相当大的。
国内图床外链
国内图床对国内访客就很友好了,审核方面他们也会帮着做。那么这种方案基本就是否决了国外图床外链,完全依赖国内图床存储了。那么问题除了上面提到的各种上传限制问题,还有就是是否稳定可靠。众所周知国内政策易变,很多图床能不能撑得住都不好说。像我整理图床里大公司背书的只有新浪图床一家,而且也没有保证是否永久允许外链,也没有说微博今后加入下线的话图片如何处理。其他的图床就更不用说了,基本是oneman单人建立,没有那么多资金支撑,能用到几天都不好说了。
综上所述,聚合图床存在很多问题,其中任何一个问题都能给其发展造成巨大困难和破坏性。相比其耗费的时间、精力、服务器运维资金,我觉得还不如自建图床划得来……