多數應用系統都會用到圖片存儲,從系統架構角度來講,像圖片存儲這樣的服務應該儘可能從核心業務中剝離出來。不少人會選擇在線雲存儲服務,好比七牛雲存儲之類的。可是不少企業項目由於各類需求,仍是會要求圖片服務部署在內部。因此咱們仍是可能會須要一個可獨立部署的圖片服務。html
本身開發實現一套圖片存儲服務系統,會花很多功夫,但若是有現成的方案何樂而不爲呢?我在Github上發現Minio和Thumbor這兩個項目能夠幫咱們達成需求。python
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是一個很是強大的圖片處理服務,能夠實現圖片裁剪、縮放、濾鏡,甚至是人臉識別。架構
它是一個基於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處理圖片很強大,可是隻提供了很弱的圖片存儲功能。其圖片上傳修改接口沒有作驗證,因此默認狀況下沒有開啓。可是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!