Lua + GraphicsMagick安装
图片的实时缩放功能是Nginx调用Lua脚本,
Lua脚本在FastDFS中下载对应的图片保存到本地,然后Lua调用GraphicsMagick实现图片的缩放功能。
1.安装Lua运行环境
要想运行Lua脚本必须先安装Lua的运行环境,在http://luajit.org/download.html
或wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz可以下载到最新的Lua运行环境LuaJIT-2.0.4。
1.1安装LuaJIT
解压下载的LuaJIT-2.0.4.tar.gz,进入LuaJIT-2.0.4目录。
tar -zxvf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4
make&& make install PREFIX=/usr/local/lj2
1.2配置环境变量
执行vi /etc/profile在文件的最后添加如下内容:
export LUAJIT_LIB=/usr/local/lj2/lib
export LUAJIT_INC=/usr/local/lj2/include/luajit-2.0
export LD_LIBRARY_PATH=/usr/local/lj2/lib:$LD_LIBRARY_PATH
export PK_CONFIG_PATH=/usr/local/lj2/lib/pkgconfig:$PK_CONFIG_PATH
保存执行source /etc/profile 使其生效。至此Lua运行环境安装完成。
2安装GraphicsMagick
GraphicsMagick是负责图片缩放功能的程序,在安装GraphicsMagick之前需要先安装libjpeg 和libpng包,否则
GraphicsMagick将不支持jpeg、jpg和png格式图片的缩放。
2.1安装libjpe和libpng
分别执行yum install –y libjpe libjpeg-devel和yum install –y libpng libpng-devel,安装libpng和libjpeg包。
2.2安装GraphicsMagick
安装完libjpeg和libpng 可以在http://sourceforge.net/projects/graphicsmagick/files/或
wget ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/1.3/GraphicsMagick-1.3.21.tar.gz下载最新的GraphicsMagick安装包。
解压GraphicsMagick-1.3.21.tar.gz, 进入GraphicsMagick-1.3.21目录,
tar -zxvf GraphicsMagick-1.3.21.tar.gz
cd GraphicsMagick-1.3.21
不存在的目录要创建好,
mkdir -p /usr/local/gm/bin
mkdir -p /usr/local/gm/sbin
mkdir -p /usr/local/gm/etc
mkdir -p /usr/local/gm/include
mkdir -p /usr/local/gm/lib
mkdir -p /usr/local/gm/libexec
mkdir -p /usr/local/gm/var
mkdir -p /usr/local/gm/share/com
mkdir -p /usr/local/gm/share/man
mkdir -p /usr/local/gm/share/info
然后执行
./configure --prefix=/usr/local/gm --exec-prefix=/usr/local/gm --bindir=/usr/local/gm/bin --sbindir=/usr/local/gm/sbin --sysconfdir=/usr/local/gm/etc --datadir=/usr/local/gm/share --includedir=/usr/local/gm/include --libdir=/usr/local/gm/lib --libexecdir=/usr/local/gm/libexec --localstatedir=/usr/local/gm/var --sharedstatedir=/usr/local/gm/share/com --mandir=/usr/local/gm/share/man --infodir=/usr/local/gm/share/info --enable-libtool-verbose --with-included-ltdl --enable-shared --disable-static --with-modules --with-frozenpaths --without-perl --without-magick-plus-plus --with-quantum-depth=8 --enable-symbol-prefix
要保证命令在一行执行.安装GraphicsMagick进行配置时出现错误configure: error: libltdl is required by modules build
问题原因:没有安装libltdl,通过yum install libtool-ltdl libtool-ltdl-devel和yum install -y libtool libtool-devel安装后再重新configure.
在./configure执行完成后,会有如图所示:
图1.
说明支持JPEG和PNG格式的图片,如果要想支持其他的,可以安装对应的包,然后重新安装GraphicsMagick。
然后make&& make install ,
2.3配置环境变量
执行vi /etc/profile在文件的最后添加如下内容:
export GM_HOME=/usr/local/gm
export PATH=$GM_HOME/bin:$PATH
export LD_LIBRARY_PATH=$GM_HOME/lib:$LD_LIBRARY_PATH
保存执行source /etc/profile 使其生效。
2.4、运行测试
在/home目录下放置一图片,然后执行
gm convert /home/P1060791.JPG -thumbnail 80x80 -background gray -gravity center -extent 80x80 /home/DSC_8943-001_80x80.jpg
如果在/home目录下生成了DSC_8943-001_80x80.jpg图片。恭喜你GraphicsMagick安装成功。
3、重新安装配置Nginx
要在Nginx调用Lua脚本,必须重新配置Tracker中的Nginx服务器,使其支持Lua脚本的调用。
3.1、安装插件包
首先下载Nginx调用Lua依赖的两个插件包lua-nginx-module和ngx_devel_kit
下载地址如下:https://github.com/openresty/lua-nginx-module和
https://github.com/simpl/ngx_devel_kit下载完成后分别解压,并拷贝到/usr/local/src目录下待用。
yum -y install epel-release git
git clone https://github.com/simpl/ngx_devel_kit.git
git clone https://github.com/openresty/lua-nginx-module.git
3.2、重新安装Nginx
进入Tracker服务器上Nginx的目录下,执行
./configure --prefix=/usr/local/webserver/nginx --with-pcre=/yxue/nginx/pcre-8.38 --with-http_stub_status_module --with-http_ssl_module --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" --add-module=/usr/local/src/ngx_cache_purge-2.3 --add-module=/usr/local/src/ngx_devel_kit --add-module=/usr/local/src/lua-nginx-module
然后执行make && make install
3.3、配置Nginx
以上安装完成后需要重新配置Nginx
第一种:
server {
listen 8000;
server_name localhost;
root /data/images;
location /lua1 {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua")';
}
location ~* ^(.+\.(jpg|jpeg|gif|png))_(\d+)x(\d+)\.(jpg|jpeg|gif|png)$ {
root /data/images;
if (!-f $request_filename) {
add_header X-Powered-By 'Lua GraphicsMagick';
add_header file-path $request_filename;
lua_code_cache off;
set $request_filepath /data/images/$1;
set $width $3;
set $height $4;
set $ext $5;
content_by_lua_file lua/ImageResizer.lua;
}
}
}
准备lua脚本ImageResizer.lua
local command = "/usr/local/gm/bin/gm convert -auto-orient -strip " .. 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);
测试,在/data/images目录下建立10.jpg图片:
http://192.168.248.129:8000/10.jpg 显示
http://192.168.248.129:8000/10.jpg_500x80.jpg 显示
http://192.168.248.129:8000/10.jpg_500x500.jpg 显示
测试,在/data/images/00/00目录下建立33.jpg图片:
http://192.168.248.129:8000/00/00/33.jpg 显示
http://192.168.248.129:8000/00/00/33.jpg_300x300.jpg 显示
第二种:
如果要做固定高宽模式裁切图片处理,例如:http://192.168.248.129:8000/00/00/1.jpg_-200.jpg 或http://192.168.248.129:8000/00/00/1.jpg_200-.jpg 这种需求,首先修改nginx配置
server {
listen 8000;
server_name localhost;
root /data/images;
location /lua1 {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua")';
}
set $upload_path /data/images;
set $img_original_root $upload_path;
set $img_thumbnail_root $upload_path/cache/thumb;
set $img_file $img_thumbnail_root$uri;
location ~* ^(.+\.(jpg|jpeg|gif|png))_((\d+\-)|(\-\d+))\.(jpg|jpeg|gif|png)$ {
root $img_thumbnail_root;
set $img_size $3;
if (!-f $img_file) {
add_header X-Powered-By 'Nginx+Lua+GraphicsMagick By Yanue';
add_header file-path $request_filename;
set $request_filepath $img_original_root$1;
set $img_size $3;
set $img_ext $2;
content_by_lua_file lua/autoSize.lua;
}
}
location ~* ^(.+\.(jpg|jpeg|gif|png))_(\d+)+x(\d+)+\.(jpg|jpeg|gif|png)$ {
root $img_thumbnail_root;
if (!-f $img_file) {
add_header X-Powered-By 'Nginx+Lua+GraphicsMagick By Yanue';
add_header file-path $request_filename;
set $request_filepath $img_original_root$1;
set $img_width $3;
set $img_height $4;
set $img_ext $5;
content_by_lua_file lua/cropSize.lua;
}
}
}
准备autoSize.lua和cropSize.lua脚本
测试,在/data/images目录下建立12.jpg图片:
http://192.168.248.129:8000/12.jpg 显示
http://192.168.248.129:8000/12.jpg_-80.jpg 显示
http://192.168.248.129:8000/12.jpg_500-.jpg 显示
http://192.168.248.129:8000/12.jpg_500x80.jpg 显示
测试,在/data/images/00/00目录下建立44.jpg图片:
http://192.168.248.129:8000/00/00/44.jpg 显示
http://192.168.248.129:8000/00/00/44.jpg_-300.jpg 显示
http://192.168.248.129:8000/00/00/44.jpg_99x99.jpg 显示
第三种(这种需要和tracker服务器取文件,而不是前两种取得硬盘文件):
lua_package_path "/usr/local/webserver/nginx/lua/?.lua;;";
server {
listen 8000;
server_name localhost;
location /lua1 {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua")';
}
location /group1/M00 {
alias /data/images;
set $image_root "/data/images";
if ($uri ~ "/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.*)") {
set $image_dir "$image_root/$3/$4/";
set $image_name "$5";
set $file "$image_dir$image_name";
}
if (!-f $file) {
#lua_code_cache off;
content_by_lua_file "lua/fastdfs.lua";
}
}
}
准备好lua脚本fastdfs.lua和restyfastdfs.lua
同时设置定时任务shell脚本crontab.sh,在linux上 ,
#凌晨2点执行,查找目录下面7天内没有被访问的文件并删除,释放空间
0 2 * * * find /data/images -atime -7 | xargs rm -rf
测试图片如下:
3.4、运行测试
重启Nginx服务,通过浏览器访问http://192.168.248.129:8000/lua1出现hello, lua说明Lua 安装成功。
通过Tracker服务客户端上传一个图片,然后通过浏览器分别访问
http://192.168.248.129:8000/group1/M00/00/00/wKj4fljw1jKANuESAA7OUB8PYRc755.JPG
http://192.168.248.129:8000/group1/M00/00/00/wKj4fljw1jKANuESAA7OUB8PYRc755.JPG_80x80.JPG
如果能够正常返回图片,说明整个环境搭建完成并且非常成功
3.5、nginx-lua-fastdfs-GraphicsMagick
参考文件:https://github.com/hpxl/nginx-lua-fastdfs-GraphicsMagick
fastdfs开源的分布式文件系统,此脚本利用nginx lua模块,动态生成图片缩略图,fastdfs只存一份原图。lua通过socket获取fastdfs的原图,
并存放到本地,根据不同规则url,例如:_60x60.jpg、_80x80.jpg,类似淘宝图片url规则。利用gm命令生成本地缩略图,第二次访问直接返回本地图片。
定时任务凌晨清除7天内未访问的图片,节省空间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)