ngx_image_thumb模塊生成縮略圖
ngx_image_thumb是nginx中用來生成縮略圖的模塊,生存縮略圖的方法很多,本nginx模塊主要功能是對請求的圖片進行縮略/水印處理,支持文字水印和圖片水印。支持自定義字體,文字大小,水印透明度,水印位置,判斷原圖是否是否大于指定尺寸才處理等等。
1. 編譯方法
編譯前請確認您的系統已經安裝了libcurl-dev libgd2-dev libpcre-dev 依賴庫
1.1 Debian / Ubuntu 系統舉例
1
2
3
|
# 如果你沒有安裝GCC相關環境才需要執行 $ sudo apt-get install build-essential m4 autoconf automake make $ sudo apt-get install libgd2-noxpm-dev libcurl4-openssl-dev libpcre3-dev |
1.2 CentOS /RedHat / Fedora
1
2
|
# 請確保已經安裝了gcc automake autoconf m4 $ sudo yum install gd-devel pcre-devel libcurl-devel |
1.3 FreeBSD / NetBSD / OpenBSD
# 不多說了,自己用port 把libcurl-dev libgd2-dev libpcre-dev 裝上吧
# 編譯前請確保已經安裝gcc automake autoconf m4
1.4 Windows
# 也支持的,不過要修改的代碼太多了,包括Nginx本身,用VC++來編譯
# 嫌麻煩可以用cygwin來編譯。還是不建議你這么做了,用Unix/Linux操作系統吧。
2. nginx / tengine 安裝
選Nginx還是Tengine,您自己看,兩者選其一
2.1 下載Tengine
1
2
3
|
# wget http://tengine.taobao.org/download/tengine-1.4.5.tar.gz # tar -zxvf tengine-1.4.5.tar.gz # cd tengine-1.4.5 |
2.2 下載Nginx
1
2
3
|
# wget http://nginx.org/download/nginx-1.4.0.tar.gz # tar -zxvf nginx-1.4.0.tar.gz # cd nginx-1.4.0 |
2.3 安裝模塊
1
2
3
4
5
|
# wget https://github.com/3078825/nginx-image/archive/master.zip # unzip master.zip # ./configure --add-module=./nginx-image-master # make # make install |
3. 配置
1
2
3
4
5
6
|
location / { root html; #添加以下配置 image on; image_output on; } |
4. 參數
- image on/off 是否開啟縮略圖功能,默認關閉
- image_backend on/off 是否開啟鏡像服務,當開啟該功能時,請求目錄不存在的圖片(判斷原圖),將自動從鏡像服務器地址下載原圖
- image_backend_server 鏡像服務器地址
- image_output on/off 是否不生成圖片而直接處理后輸出 默認off
- image_jpeg_quality 75 生成JPEG圖片的質量 默認值75
- image_water on/off 是否開啟水印功能
- image_water_type 0/1 水印類型 0:圖片水印 1:文字水印
- image_water_min 300 300 圖片寬度 300 高度 300 的情況才添加水印
- image_water_pos 0-9 水印位置 默認值9 0為隨機位置,1為頂端居左,2為頂端居中,3為頂端居右,4為中部居左,5為中部居中,6為中部居右,7為底端居左,8為底端居中,9為底端居右
- image_water_file 水印文件(jpg/png/gif),絕對路徑或者相對路徑的水印圖片
- image_water_transparent 水印透明度,默認20
- image_water_text 水印文字 "Power By Vampire"
- image_water_font_size 水印大小 默認 5
- image_water_font 文字水印字體文件路徑
- image_water_color 水印文字顏色,默認 #000000
4.1調用說明
這里假設你的nginx 訪問地址為 http://127.0.0.1/
并在nginx網站根目錄存在一個 test.jpg 的圖片
通過訪問
http://127.0.0.1/test.jpg!c300x200.jpg 將會 生成/輸出 test.jpg 300x200 的縮略圖
其中 c 是生成圖片縮略圖的參數, 300 是生成縮略圖的 寬度 200 是生成縮略圖的 高度
一共可以生成四種不同類型的縮略圖。
支持 jpeg / png / gif (Gif生成后變成靜態圖片)
C 參數按請求寬高比例從圖片高度 10% 處開始截取圖片,然后縮放/放大到指定尺寸( 圖片縮略圖大小等于請求的寬高 )
M 參數按請求寬高比例居中截圖圖片,然后縮放/放大到指定尺寸( 圖片縮略圖大小等于請求的寬高 )
T 參數按請求寬高比例按比例縮放/放大到指定尺寸( 圖片縮略圖大小可能小于請求的寬高 )
W 參數按請求寬高比例縮放/放大到指定尺寸,空白處填充白色背景顏色( 圖片縮略圖大小等于請求的寬高 )
5. 調用舉例
1
2
3
4
5
6
7
8
|
http://127.0.0.1/test.jpg!c300x300.jpg http://127.0.0.1/test.jpg!t300x300.jpg http://127.0.0.1/test.jpg!m300x300.jpg http://127.0.0.1/test.jpg!w300x300.jpg http://127.0.0.1/test.c300x300.jpg http://127.0.0.1/test.t300x300.jpg http://127.0.0.1/test.m300x300.jpg http://127.0.0.1/test.w300x300.jpg |
nginx實時生成縮略圖到硬盤上
現在隨著各終端的出現(手機,ipad等平板),以及各種終端的手機分辨率和尺寸都不同,現在手機用戶流量都是寶,網上出現了各種各樣的生成縮略圖功能的架構,有使用php實時生成縮略圖的,也有用nginx + lua實現的,上面我也講到了使用nginx生成縮略圖,但是用戶每次訪問都需要生成一次,會給cpu和硬盤帶來比較大的壓力,今天帶來了另外一種方式,這次使用nginx將原圖生成縮略圖到硬盤上.看我的配置
1. 首先建好cache目錄
1
|
# mkdir /data/site_cache/ |
2. 修改nginx配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
location ~* ^/resize { root /data/site_cache/$server_name; set $width 150; set $height 100; set $dimens ""; if ($uri ~* "^/resize_(\d+)x(\d+)/(.*)" ) { set $width $1; set $height $2; set $image_path $3; set $demins "_$1x$2"; } if ($uri ~* "^/resize/(.*)" ) { set $image_path $1; } set $image_uri image_resize/$image_path?width=$width&height=$height; if (!-f $request_filename) { proxy_pass http://127.0.0.1/$image_uri; break; } proxy_store /data/site_cache/$server_name/resize$demins/$image_path; proxy_store_access user:rw group:rw all:r; proxy_set_header Host $host; expires 30d; access_log off; } location /image_resize { alias /data/site/$server_name/; image_filter resize $arg_width $arg_height; image_filter_jpeg_quality 75; access_log off; } |
生成縮略圖流程如下:
(1)、原圖在www.ythuaji.com.cn/image/1.jpg。我需要一份100x100的縮略圖。
(2)、請求www.ythuaji.com.cn/resize_100x100/image/1.jpg.
(3)、這個請求進入了location ~* ^/resize,接著判斷image_path這個目錄下是否存在這張圖片,如果存在直接放回給用戶,
(4)、不存在那么跳轉到//www.ythuaji.com.cn/image_resize/image/1.jpg?width=100&height=100;
(5)、location /image_resize根據傳入的width和height執行縮略功能,并且設置圖像質量為75
(6)、接著生成文件到/data/site_cache/www.ythuaji.com.cn/resize_100x100/image/1.jpg
(7)、并且返回圖片給用戶
(8)、nginx生成縮略圖到硬盤上的功能到這里就結束了