1. 程式人生 > >nginx+lua+GraphicsMagick生成實時縮略圖-CentOS7

nginx+lua+GraphicsMagick生成實時縮略圖-CentOS7

系統 占用 buaa 使用 nginx xxx ali blog 判斷

背景

大多數的系統都會涉及縮略圖的處理,比如新聞系統和電商系統,特別是電商系統,每個商品大圖都會對應一系列尺寸的縮略圖用於不同業務場景的使用。部分系統也會生成不同尺寸的縮略圖以供PC、手機端、ipad端使用。

解決方案探索:

  1. 直接加載原圖,使用css樣式表來控制圖片的寬高。顯然不太合適,大家也盡量不要這樣做。
  2. web程序在上傳成功後,同時生成相應縮略圖。這種做法效率較低,如果遇到批量導入的業務時嚴重影響性能。並且同步生成縮略圖會占用一定量的存儲空間,如果能按需生成豈不更好?
  3. 使用七牛、阿裏雲提供的雲存儲及數據處理服務,解決圖片的處理、存儲、多節點訪問速度的問題,這種方式優點是方案成熟,相應的有一定費用和開發工作,另外有一些小概率的風險,比如雲服務掛掉影響本站訪問。
  4. 使用第三方的圖片處理程序,比如zimg,點擊查看使用手冊,@招牌瘋子開發。zimg的性能和擴展性不錯,文檔也很完善,會繼續保持關註。

本文使用的是Nginx+Lua+GraphicsMagick實現縮略圖功能,圖片的上傳及刪除還是交由web服務處理,縮略圖由單獨的模塊去完成。最終效果類似淘寶圖片,實現自定義圖片尺寸功能,可根據圖片加後綴100x100.jpg(固定高寬),-100.jpg(定高),_100-.jpg(定寬)形式實現自定義輸出圖片大小。

說明

文件夾規劃

img.xxx.com(如/usr/local/filebase)
├─upload
│  └─img
│    ├─001.jpg
│    └─002.jpg

自定義尺寸後的路徑

thumb(/tmp/thumb,可在conf文件裏面更改)
├─upload
│  └─img
│    ├─001.jpg_100x100.jpg #固定高和寬
│    ├─001.jpg_-100.jpg #定高
│    ├─001.jpg_200-.jpg #定寬
│    └─002.jpg_300x300.jpg #固定高和寬
  • 其中img.xxx.com為圖片站點根目錄,img目錄是原圖目錄
  • 縮略圖目錄根據保持原有結構,並單獨設置目錄,可定時清理。

鏈接地址對應關系
原圖訪問地址:http://img.xxx.com/upload/img/001.jpg
縮略圖訪問地址:http://img.xxx.com/upload/img/001.jpg_100x100.jpg 即為寬100,高100

自動寬地址: http://img.xxx.com/upload/img/001.jpg_-100.jpg 用"-"表示自動,即為高100,寬自動
自動高地址: http://img.xxx.com/upload/img/001.jpg_200-.jpg 用"-"表示自動,即為寬200,高自動

訪問流程

  • 首先判斷縮略圖是否存在,如存在則直接顯示縮略圖;
  • 縮略圖不存在,則判斷原圖是否存在,如原圖存在則拼接graphicsmagick(gm)命令,生成並顯示縮略圖,否則返回404

nginx+lua+GraphicsMagick生成實時縮略圖-CentOS7