近期恰好有時間,整理一下nginx-lua-fastdfs-GraphicsMagick。簡單說就是,在nginx配置圖片請求lua腳本,腳本中經過GraphicsMagick命令將fastdfs文件系統上的圖片變動成指定的尺寸。ios
先看看前輩們的案例:(等比例縮略圖生成)nginx
原圖(800*800):http://gi1.md.alicdn.com/imgextra/i1/401612253/T2ASPfXE4XXXXXXXXX_!!401612253.jpggit
60*60: http://gi1.md.alicdn.com/imgextra/i1/401612253/T2ASPfXE4XXXXXXXXX_!!401612253.jpg_60x60.jpggithub
80*80:http://gi1.md.alicdn.com/imgextra/i1/401612253/T2ASPfXE4XXXXXXXXX_!!401612253.jpg_80x80.jpgmongodb
1、nginx-lua 配置:vim
1.檢查已經裝的nginx路徑和版本:windows
#find /|grep nginx.conf瀏覽器
/usr/local/nginx/conftomcat
#/usr/local/nginx/sbin/nginx -vcurl
nginx version: nginx/1.9.8
注:若是是nginx1.6如下是版本先看下面升級nginx的方法先升級,不然安裝不了
二、 下載luajit 2.0.5並安裝
# wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
# tar -zxvf LuaJIT-2.0.5.tar.gz
# cd LuaJIT-2.0.5/
# make && make install
執行後會顯示日誌:==== Successfully built LuaJIT 2.0.5 ====
三、 下載ngx_devel_kit http://github.com/simpl/ngx_devel_kit/tags 解壓
# wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
# tar -zxvf v0.2.19.tar.gz
解壓後將會看到:ngx_devel_kit-0.2.19文件
四、 下載nginx_lua_module http://github.com/chaoslawful/lua-nginx-module/tags 解壓
# wget https://github.com/openresty/lua-nginx-module/archive/v0.10.0.tar.gz
# tar -zxvf v0.10.0.tar.gz
解壓後將會看到:lua-nginx-module-0.10.0文件
五、導入環境變量,編譯用,LuaJIT默認安裝在(/usr/local/lib)
# ls /usr/local/lib
# ls /usr/local/include/
# export LUAJIT_LIB=/usr/local/lib
# export LUAJIT_INC=/usr/local/include/luajit-2.0
上面方法的PATH 在終端關閉 後就會消失。
vim /etc/profile
在文檔最後,添加:
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
保存,退出,而後運行:
#source /etc/profile
不報錯則成功。
六、 進入nginx源碼文件夾,增長編譯參數
# /usr/local/nginx/sbin/nginx -v
顯示版本信息: nginx/1.9.8
# find /|grep nginx-1.9.8
# cd /usr/local/temp/nginx-1.9.8/
./configure --user=www --group=www --prefix=/usr/local/nginx --with-pcre=/usr/local/temp/pcre-8.37 --add-module=/usr/local/temp/ngx_cache_purge-2.3 --add-module=/usr/local/temp/ngx_devel_kit-0.2.19 --add-module=/usr/local/temp/lua-nginx-module-0.10.0
參數說明:
./configure --prefix=/etc/nginx \ #nginx的安裝路徑
--add-module=/home/user/ngx_devel_kit-0.2.19 \ #ngx_devel_kit 的源碼路徑
--add-module=/home/user/lua-nginx-module-0.10.0 #nginx_lua_module 的源碼路徑
七、執行安裝
# cd /usr/local/temp/nginx-1.9.8/
# make
# make install
發現nginx版本過低安裝不了,須要先升級
/home/user/lua-nginx-module-0.10.0/src/ngx_http_lua_common.h:26:2: error: #error at least nginx 1.6.0 is required but found an older version
版本過低,先進行下面步驟升級nginx
八、測試是否成功
# find /|grep nginx.conf
/usr/local/nginx/conf
加入
location /lua {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua")';
}
# /usr/local/nginx/sbin/nginx -t --驗證配置文件是否配置正常
# /usr/local/nginx/sbin/nginx -s stop --上面失敗後沒法中止nginx
報錯:error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
解決:
# find / -name libluajit-5.1.so.2 --查找該包確實存在
# ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2 --生成軟連接
接下來再次中止
# /usr/local/nginx/sbin/nginx -s stop
# /usr/local/nginx/sbin/nginx
瀏覽器訪問http://ip:port/lua,會出現「hello,lua」;或者使用#curl http://service.quivertree.com/lua,也會顯示「hello,lua」。安裝成功!
2、安裝GraphicsMagick:
一、下載壓縮包:GraphicsMagick:http://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/
二、上傳解壓:tar -zxvf GraphicsMagick-1.3.30.tar.gz (windows下載)
或 tar -Jxvf GraphicsMagick-1.3.30.tar.xz (ios下載)
[/usr/local/temp/GraphicsMagick-1.3.30]# ./configure --prefix=/usr/local/GraphicsMagick --enable-shared
[/usr/local/temp/GraphicsMagick-1.3.30]# make
[/usr/local/temp/GraphicsMagick-1.3.30]# make install
[/usr/local/temp/GraphicsMagick-1.3.30]# /usr/local/GraphicsMagick/bin/gm version
會顯示出GraphicsMagick支持的圖片格式,即安裝成功!
Feature Support:
Native Thread Safe yes
Large Files (> 32 bit) yes
Large Memory (> 32 bit) yes
BZIP no
DPS no
FlashPix no
FreeType no
Ghostscript (Library) no
JBIG no
JPEG-2000 no
JPEG no
Little CMS no
Loadable Modules no
OpenMP yes (200805)
PNG no
TIFF no
TRIO no
UMEM no
WebP no
WMF no
X11 no
XML no
ZLIB yes
三、下載lib,支持JPEG、PNG
wget http://www.imagemagick.org/download/delegates/jpegsrc.v9b.tar.gz
wget http://www.imagemagick.org/download/delegates/libpng-1.6.31.tar.gz
tar -zxvf jpegsrc.v9b.tar.gz
tar -zxvf libpng-1.6.31.tar.gz
解壓後生成文件:jpeg-9b、libpng-1.6.31
[jpeg-9b]# ./configure
[jpeg-9b]# ./make
[jpeg-9b]# ./make install
[libpng-1.6.31]# ./configure
[libpng-1.6.31]# ./make
[libpng-1.6.31]# ./make install
安裝完成後,從新安裝GraphicsMagick,即:
[/usr/local/temp/GraphicsMagick-1.3.30]# make
[/usr/local/temp/GraphicsMagick-1.3.30]# make install
[/usr/local/temp/GraphicsMagick-1.3.30]# /usr/local/GraphicsMagick/bin/gm version
提示錯誤:
/usr/local/GraphicsMagick/bin/gm: error while loading shared libraries: libjpeg.so.9: cannot open shared object file: No such file or directory
系統不知道libjpeg.so放在哪一個目錄下,這時候就要在/etc/ld.so.conf中加入libjpeg.so所在的目錄。通常而言,有不少的so會存放在/usr/local/lib這個目錄底下,去這個目錄底下找,果真發現本身所須要的libjpeg.so文件。因此,在/etc/ld.so.conf中加入/usr/local/lib這一行,保存以後,再運行:
[/]# /sbin/ldconfig -v --更新一下配置便可。
[/usr/local/temp/GraphicsMagick-1.3.30]# /usr/local/GraphicsMagick/bin/gm version
Feature Support:
Native Thread Safe yes
Large Files (> 32 bit) yes
Large Memory (> 32 bit) yes
BZIP no
DPS no
FlashPix no
FreeType no
Ghostscript (Library) no
JBIG no
JPEG-2000 no
JPEG yes
Little CMS no
Loadable Modules no
OpenMP yes (200805)
PNG yes
TIFF no
TRIO no
UMEM no
WebP no
WMF no
X11 no
XML no
ZLIB yes
四、測試生成圖片:
原圖地址:/usr/local/test/1.jpg
[/usr/local/GraphicsMagick/bin]# gm convert -resize 100x80^ -gravity Center -crop 100x80+0+0 /usr/local/test/1.jpg /usr/local/test/2.jpg
執行成功,能夠在/usr/local/下查看到新生成的圖片2.jpg。
將gm命令設置成全局變量,即:
vi /etc/profile
設置 PATH=$JAVA_HOME/bin:$PATH:/usr/local/mongodb/bin:/usr/local/GraphicsMagick/bin
保存後,執行 source /etc/profile ,完成更新。
gm identify /usr/local/test/1.jpg
顯示:/usr/local/test/1.jpg JPEG 1280x720+0+0 DirectClass 8-bit 137.5Ki 0.000u 0m:0.000004s
五、編寫腳本vi ImageResizer.lua
local command = "/usr/local/GraphicsMagick/bin/gm convert " .. ngx.var.request_filepath .. " -resize " .. ngx.var.width .. "x" .. ngx.var.height .. " +profile \"*\" " .. ngx.var.request_filepath .. "_" .. ngx.var.width .. "x" .. ngx.var.height .. "." .. ngx.var.ext; os.execute(command); // 執行裁剪命令 ngx.exec(ngx.var.request_uri); // 輸出裁剪後的圖片
六、修改nginx的配置文件nginx.conf
location ~ /pic/ { root /usr/local/tomcat/static; if ($uri ~* ^/pic/(.+\.(jpg|jpeg|gif|png))_(\d+)x(\d+)\.(jpg|jpeg|gif|png)) { add_header X-Powered-By 'Lua GraphicsMagick'; add_header file-path $request_filename; lua_code_cache on; set $request_filepath /usr/local/tomcat/static/pic/$1; set $width $3; set $height $4; set $ext $5; } if (!-f $request_filename) { content_by_lua_file /usr/local/nginx/ImageResizer.lua; } }
七、訪問報錯404/500
[/usr/local/nginx/logs]# tail -f error.log
若是報錯信息爲 /usr/local/GraphicsMagick/bin/gm convert: Unable to open file (/usr/local/tomcat/static/article/pic/110/1.jpg_80x80.jpg) [Permission denied].
發現沒有對應權限,進行圖片文件夾pic受權:
[/usr/local/tomcat/static/article/]chmod 777 -R pic
再次訪問就能夠了 ~over~