近期恰好有时间,整理一下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~