Lua + GraphicsMagick安装

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天内未访问的图片,节省空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值