基于Minio和Thumbor搭建独立图片服务

多数应用系统都会用到图片存储,从系统架构角度来讲,像图片存储这样的服务应该尽可能从核心业务中剥离出来。不少人会选择在线云存储服务,好比七牛云存储之类的。可是不少企业项目由于各类需求,仍是会要求图片服务部署在内部。因此咱们仍是可能会须要一个可独立部署的图片服务。html

本身开发实现一套图片存储服务系统,会花很多功夫,但若是有现成的方案何乐而不为呢?我在Github上发现Minio和Thumbor这两个项目能够帮咱们达成需求。python

Minio

Minio Cloud Storage是一个分布式对象存储系统。它是一个基于Go的开源项目,而且实现了Amazon S3的API。也就是说Minio至关于一个开源的Amazon S3。git

使用docker安装多是最省事的方式,两行命令便可安装下载而且运行起来。注意,这种启动模式仅限于测试环境下,一旦命令终止,数据将会消失。生产环境下的安装部署请参考文档。github

docker pull minio/minio
docker run -p 9000:9000 minio/minio server /export

启动以后,命令行中就会显示一堆系统信息。docker

Endpoint:  http://172.17.0.2:9000  http://127.0.0.1:9000
AccessKey: PT7TIDXEV7KH7S5R91JH
SecretKey: 17hdYH0mF2Ljd3ahZ7JGyi5l/ZPjunLlldUMY/A0
Region:    us-east-1
SQS ARNs:  <none>

以后就能够在浏览器中访问 http://127.0.0.1:9000 而且使用AccessKey和SecretKey登陆。后端

其核心功能很简单,建立bucket,上传文件。其全部的文件连接都是含有过时时间的私有连接。而后咱们就可使用其提供的SDK使用了,就是这么简单。浏览器

minio专一于文件存储,并无什么图片处理功能,可是咱们可使用thumbor这个服务来作图片处理。七牛云存储

Thumbor

Thumbor是一个很是强大的图片处理服务,能够实现图片裁剪、缩放、滤镜,甚至是人脸识别。架构

它是一个基于Python的开源项目,在python环境下能够经过pip安装。app

pip install thumbor

而后使用下面命令便可运行。

thumbor-config > ./thumbor.conf # 生成配置文件
thumbor --port=8888 --conf=thumbor.conf

该服务运行在本地的8888端口,以后能够就能够直接经过url调用服务了。

好比这张图片 https://www.apple.com/cn/home/images/gallery/iphone_alt_small_2x.jpg

就可使用 http://localhost:8888/unsafe/300x200/https://www.apple.com/cn/home/images/gallery/iphone_alt_small_2x.jpg 这个url使其缩放到300x200大小。

Thumbor AWS

Thumbor处理图片很强大,可是只提供了很弱的图片存储功能。其图片上传修改接口没有作验证,因此默认状况下没有开启。可是Thumbor有一些社区支持,第三方开发者作了一些扩展。其中Thumbor AWS 这个扩展能够把Thumbor后端跟Amazon S3整合起来。在url上提交图片文件的key,Thumbor的后端会从Amazon S3中取出文件作处理。而以前Minio兼容Amazon S3的Api。因此意味着只须要作一点改动,就能够整合这两个服务。最终就能够达成,利用Minio上传存储图片,利用Thumbor取出图片作处理。

咱们利用pip来安装这个扩展。

pip install tc_aws

Thumbor AWS这个扩展利用Boto3链接Amazon S3的SDK,根据Boto3文档中的配置,咱们须要建立 ~/.aws/credentials 这个文件,而且填写刚才Minio提供的AccessKey和SecretKey,受权这个服务访问Minio。

[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY

以后在刚才利用thumbor_conf生成的thumbor.conf中修改一些配置。

TC_AWS_REGION='us-east-1' #填写minio提供的Region
TC_AWS_ENDPOINT='http://127.0.0.1:9000' #将默认的Amazon S3地址换成minio运行地址
LOADER = 'tc_aws.loaders.s3_loader' #将Thumbor的loader换成tc_aws.loaders.s3_loader

从新启动Thumbor,而后就能够在浏览器中经过Thumbor访问Minio中的图片了。

好比,在Minio的docker这个bucket中上传了一张aaa.jpg,而后咱们就能够经过 http://localhost:8888/unsafe/docker/aaa.jpg 这个地址访问到这张图片的原图。固然,咱们能够经过 http://localhost:8888/unsafe/300x200/docker/aaa.jpg 这种方式对这张图片进行300x200的缩放。

这样咱们就大功告成了。

总结

各类服务都有其专精的一面,幸亏Amazon S3在云服务API层面上造成了某种事实上的标准,因此这点可以帮助咱们将一些服务整合在一块儿。

实现效果上来看,最终达成了图片存储和提取缩放需求,对于一些项目也足够使用。不过图片经过Thumbor处理后,其私有连接的属性也没了。这在一些要求高的企业服务项目中也是蛮尴尬的。

简单看了下Thumbor的源码,其图片输出是tornado实现的,相信有时间hack一下源码,实现私有连接也不会太困难的。

Enjoy it!

相关文章
相关标签/搜索