多数应用系统都会用到图片存储,从系统架构角度来说,像图片存储这样的服务应该尽量从核心业务中剥离出来。很多人会选择在线云存储服务,比如七牛云存储之类的。但是很多企业项目因为各种需求,还是会要求图片服务部署在内部。所以我们还是可能会需要一个可独立部署的图片服务。

自己开发实现一套图片存储服务系统,会花不少功夫,但如果有现成的方案何乐而不为呢?我在Github上发现Minio和Thumbor这两个项目可以帮我们达成需求。

Minio

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

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

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

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

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安装。

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!

基于Minio和Thumbor搭建独立图片服务相关推荐

  1. Centos7 搭建Nginx图片服务超详细新手小白教程

    简介:以上文章讲述的是[Centos7超详细的安装与部署应用MySQL,Redis]接下来我总结一下[Centos7 搭建Nginx图片服务超详细教程].觉得我还可以的可以加群一起督促学习探讨技术.Q ...

  2. ginapi服务器性能,基于gin web框架搭建RESTful API服务

    这篇主要学习go项目中的项目结构.项目规范等知识,ROM采用的database/sql的写法. 1.技术框架 利用的是ginweb框架,然后ROM层选用database/sql,安装mysql驱动.安 ...

  3. Nginx 独立图片服务器的搭建

    为什么需要独立图片服务器? 如果你留心的话,可以发现,现在主流的网站都是有单独的图片服务器的,例如,人人网的为rrimg,淘宝的为taobaocdn,下面还有很多的二级域名. 独立的图片服务器有诸多好 ...

  4. Nginx独立图片服务器搭建教程

    Nginx独立图片服务器搭建教程 发布时间:2014-06-04编辑:脚本学堂 本文介绍了nginx独立图片服务器的搭建与配置教程,有需要的朋友参考下. 首先,为什么需要独立图片服务器? 现在主流的网 ...

  5. SpringBoot 搭建基于 minio 的高性能存储服务

    欢迎关注方志朋的博客,回复"666"获面试宝典 什么是minio 引用官网: MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储.它与Amazon S3 ...

  6. 图片服务 - thumbor设置背景色

    图片服务 - thumbor设置背景色 背景颜色 在GitHub上编辑 背景颜色 用法:background_color(颜色) 说明 background_color过滤器将背景图层设置为指定的颜色 ...

  7. 使用nginx搭建音视频点播服务——基于DASH协议

    文章目录 1 DASH流媒体协议 2 搭建点播服务 2.1 nginx代理 2.2 nginx-vod-module模块 2.3 配置nginx下的DASH点播服务 2.3.1 常规配置 2.3.2 ...

  8. 分布式文件系统研究-搭建图片服务虚拟主机

    搭建图片虚拟主机 在storage上安装Nginx 在 storage server 上安装 nginx 的目的是对外通过 http 访问 storage server 上的文 件.使用 nginx ...

  9. 图片服务 - thumbor启用AutoJPG

    图片服务 - thumbor启用AutoJPG 用法:autojpg(启用) 说明 此过滤器会覆盖AUTO_PNG_TO_JPG配置变量. 参数 enabled - 传递True,这是默认值,您将覆盖 ...

最新文章

  1. UESTC 1811 Hero Saving Princess
  2. 思科无线AP胖瘦互转
  3. Cocoapods 私有库
  4. SyntaxError: Non-UTF-8 code starting with ‘\xe4‘ in file解决办法
  5. shell预定义变量
  6. kubeadmin 安装 k8s集群
  7. 如何用 Hook 实时处理和保存 Ajax 数据
  8. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)
  9. git 常用指令 -
  10. java彩票开奖程序_用java 实现彩票摇奖,猜拳程序
  11. 字符串的getBytes方法
  12. java info()方法_Java Provider getInfo()用法及代码示例
  13. android 画爱心进度条_android自定义圆形进度条,实现动态画圆效果
  14. 苹果cms详细安装方法
  15. R语言绘图--高级图形之Circos
  16. space_sniffer 清理 磁盘
  17. 转载_ASK,OOK,FSK,GFSK简介
  18. 记一次阿里云ECS服务器centos6.5无法使用epel源的爬坑
  19. 烂大街的TCP/IP网络模型,你真的懂了?
  20. 汤因比与《历史研究》

热门文章

  1. 使用 Laravel sharedLock 与 lockForUpdate 进行数据表行锁
  2. java test 用法,pytest基本用法简介
  3. 关于struts2 中result type=stream
  4. 原来sync.Once还能这么用
  5. 遍历集合常见的两种方式
  6. 携程Apollo分布式配置中心搭建指南
  7. js中split,splice,slice方法之间的差异。
  8. .net core + headless chrome实现动态网页爬虫
  9. 【跃迁之路】【425天】程序员高效学习方法论探索系列(实验阶段182-2018.04.06)...
  10. mipi 调试经验【转】