熟悉的朋友可能知道我以前写过一个分布式图片存储插件,名叫popic。
原理比较简单,就是把图片按照内容页id存入服务器中,供内容页面调用。如果某个存储器塞满,站长可以换下一个存储器,新增加的帖子上传图片,只需要修改存储器ID即可。存储器端代码无需数据库,只需要PHP环境即可动态加载,同时判断来路防盗链等。其实类似的程序也有不少,只不过很少有能把图片分发到多个存储,大多数作为独立图床存在。
因为这个插件具有高度的独立性,因为逻辑简单,理论上可以轻易加载到任何PHP程序中(比如WP、Typecho、Zblog、Emlog、Xiuno等,它们的“页面”只是加载了模板的帖子,内容ID还是在一个表中的)。这个程序在我的博客和之前的图库都有用到,最多曾存储6万张图片,日访问量3000+IP,较好地通过了负载测试。
最近研究主机发现一个有趣的现象,很多站长手里有大量无用的限制主机资源,而有些站长又苦于没有CDN。传统的CDN只能作为一个反向代理使用,只能缓存静态文件,而且一个网站只能使用一个固定的CDN。那么可不可以把这些闲置的主机资源作为动态图床CDN(缓存器)使用呢?为此我就想出一个似乎可行的思路:
1.主站安装popic,用户将图片上传至存储器。
2.在N个缓存器配置pocdn,并将缓存器地址写入主站数据库。
3.用户读取主站内容时,主站调用随机的可用缓存器API。
4.缓存器判断磁盘容量,若额度即将超限,则向主站发送不再缓存请求,主站把该缓存器标记为不可用。
5.若缓存器可用,则从存储器下载(curl)原图(或缩略图)缓存至自身,将图片输出至客户端。
6.若缓存器宕机,客户端JS判断无法加载,则向主站发送错误记录(客户端标识、时间、错误频次等),并加载新缓存器。
7.主站根据错误记录,降低使用频率、停用或删除无法使用的缓存器,另可根据缓存器地区记录,实现请求调度。
8.后期缓存器可由客户捐赠,主站根据缓存器缓存额度记录,对捐赠用户进行奖励。
这种方案的好处有很多,除了充分利用闲置VPS资源、避免单一CDN方案外,还可以很大程度上减少图片存储域名被墙给网站带来的影响。这种方案目前一些网站(ex绅士)已经在使用,但他们是利用类似于P2P的客户端,让用户安装程序后对图片进行分流,而且只能通过IP地址:端口加载。pocdn可以基于任意主机和域名,强制https链接,通讯更加安全可靠。