Lua + GraphicsMagick安装

2023-05-16

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(使用前将#替换为@)

Lua + GraphicsMagick安装 的相关文章

  • 如果模式匹配,则打印 lua 表中的值

    好吧 我最近刚接触 lua 发现自己陷入了以下困境 我有函数peripheral getNames 这是一个自定义函数 它将返回一个具有结构 key value 的表 而 key 始终是一个数字 从 1 开始 value 将是该函数找到的内
  • 在Lua中,处理包含nil的可变参数的正确方法是什么?

    我正在尝试创建一个调试打印函数 它将文件句柄作为第一个参数 首先 我写一个这样的函数 function fprint f for i v in ipairs do f write tostring v f write t end f wri
  • proxy_pass 不使用 /etc/hosts 解析 DNS

    在 Nginx 中proxy pass指令未使用以下命令解析 DNS etc hosts文件 有什么方法可以实现这种可能性 也许利用 Lua 作为最后的手段 如果您有一台带有 systemd 的服务器 您可以使用它附带的名称服务器 syst
  • 仅当宽度超过 Graphics/Image Magick 时如何调整图像大小

    正如这里所见 http www imagemagick org Usage resize shrink http www imagemagick org Usage resize shrink选项 resize 64x64 gt 仅当宽度和
  • 寻找 Lua 4.1 alpha

    我正在帮助为一款相当老的游戏 孤岛惊魂 开发多人模式 我想编译lua代码 但游戏使用版本4 1 alpha 我在任何地方都找不到 lua 4 1 alpha tar gz http www lua org work old lua 4 1
  • 设置私有 luarocks 存储库

    对于我的设置 我需要一个 luarocks rock 的私有存储库 我可以将它们安装在我的开发环境中 而无需连接到互联网 为 luarocks 设置远程存储库的步骤是什么 我可以使用 sftp 服务器吗 有人有过这样的经历吗 在深入研究这个
  • 从lua中的函数返回多个值

    我正在尝试以下 lua 代码 function test return 1 2 end function test2 return test end function test3 return test 3 end print test p
  • 无法在cmake中使用find_package找到Lua标头

    我正在尝试使用 CMake 为我使用 Lua 的项目构建生成 make 文件 当我运行 make 时出现此错误 path to my project luaudio luaudio c 1 17 fatal error lua h No s
  • 覆盖 require 后调用 lua_getfield() 时崩溃

    这个问题与 Henri Menke 在这个问题中的回答相关 如何在 C 中获取预加载模块名称 https stackoverflow com questions 51510308 how to get preloaded module na
  • 如何在表中表示 nil

    假设我想存储一个元素列表 包括一些零值 值的位置很重要 我需要表示列表中给定位置处不存在值 这里有一个问题 a 1 2 3 nil 4 for k v in ipairs a do print k v end print a 4 print
  • 使用 OOP 的闭包方法时如何实现受保护的成员?

    现在我正在使用实施 OOP 的闭包 http lua users org wiki ObjectOrientationClosureApproach在卢阿 下面是一个简短的示例 我的问题发生在尝试实施时stronger heal insid
  • Lua中如何对数字表求和?

    Lua有内置的吗sum 功能 我似乎找不到一个 我几乎翻遍了文档中的所有地方 或许table sum 或类似的东西 以遵循当前的约定 但由于我找不到它 我不得不实现它 function sum t local sum 0 for k v i
  • 在 Corona sdk 上保存高分?

    我想保存游戏中创建的高分 并且当玩家点击高分按钮时可以在主菜单中看到 有人可以帮助我吗 您可以使用SQLITE https docs coronalabs com api library sqlite3 index html将高分保存到数据
  • C 的哪些部分最可移植?

    我最近读到了 Lua 联合创始人 Luiz H de Figueredo 和 Roberto Ierusalimschy 的采访 他们讨论了 Lua 的设计和实现 至少可以说这是非常有趣的 然而 讨论的一部分让我想起了一些事情 Robert
  • 如何在aerospike中获取ttl为-1的记录集?

    我在aerospike中有很多记录 我想获取ttl为 1的记录 请提供解决方案 只是为了澄清 设置TTL 为 1 https github com aerospike aerospike client go blob master docs
  • Lua-迭代嵌套表

    我已经学习 Lua 几个星期了 这一次又一次成为我的症结所在 我尝试阅读有关该主题的帖子和书籍 我使用 Lua 查询软件监控系统 Nimsoft 我的数据以表格形式返回给我 我不会发布整个输出 但这里有一个我认为可以描述结构的片段 表参考是
  • Lua :: 如何编写加载多个CPU的简单程序?

    我还无法用 Lua 编写一个可以加载多个 CPU 的程序 自从Lua通过协程支持这个概念 http www lua org pil 9 4 html 我相信这是可以实现的 我失败的原因可能是以下之一 这在Lua中是不可能的 我写不出来 an
  • 去掉尾随零和小数点

    使用 Lua 我将数字格式化为可变位数并去掉尾随零 小数点 例如 string format precision f value gsub 0 1 gsub 值的类型为数字 正数 负数 整数 小数 所以任务已经解决了 但出于美学 教育和性能
  • 安装Lua套接字库

    要么我太累了 要么我瞎了 我想学习 Lua 网络 因此我必须安装socketlib 所以我可以轻松地要求它 但我不知道我应该 要求 哪些文件 例子说 local socket require socket 但正如我所说 如果我使用 我不知道
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换

随机推荐

  • 关于深度学习主机的一些选配问题

    作为一个深度学习的初学者 xff0c 你可能会遇到这样的问题 xff1a 我该如何训练我自己或者别人的Model xff1f 我该如何配置一台合适的主机 xff1f 目前有哪几种训练模型的方式 xff1f 接下来 xff0c 我将会对此进行
  • FreeRTOS中两个同等级无阻塞打印任务,只有一个能正常打印

    环境 xff1a STM32CubeMX 43 MDK5 printf重定向用的是官方例子 ifdef GNUC With GCC small printf option LD Linker gt Libraries gt Small pr
  • putty 连接Debian linux 报错Connection refused

    ubuntu默认并没有安装ssh服务 xff0c 如果通过ssh链接ubuntu xff0c 需要自己手动安装ssh server 判断是否安装ssh服务 xff0c 可以通过如下命令进行 xff1a xjj 64 xjj desktop
  • python 使用playsound模块出现编码问题。

    Error 259 for command play sound zhou mp3 wait 驱动程序无法识别指定的命令参数 Error 263 for command close sound zhou mp3 指定的设备未打开 xff0c
  • C/C++ 编程推荐学习顺序和书籍

    自学或者学习C C 43 43 编程不知道怎么办 xff1f 那么恭喜你看到本文 xff0c 本文将会为你提供C C 43 43 编程的学习书籍顺序推荐 xff0c 希望对大家有帮助 xff01 C C 43 43 语言基础入门书籍 xff
  • Android Studio 控制台中文乱码,解决方案都在这里了,完美解决

    前言 Android Studio 如果不进行配置的话 xff0c 运行程序时控制台中文乱码问题会非常严重 xff0c 甚至影响我们对信息的获取和程序的跟踪 通过历年的开发经验 xff0c 在本文中我总结出四点用于解决控制台中文乱码问题的方
  • 【C/C++】中的__FILE__、__LINE__、#line、__func__关键字(预定义宏)

    c 43 43 11预先定义了一些标识符 xff0c 其实也就是宏 现在简单说几个 xff1a 1 FILE 用于指示本行语句所在源文件的文件名 xff0c 如下 xff08 test c xff09 xff1a include lt st
  • 视觉SLAM入门十四讲

    视觉SLAM入门十四讲 写在前面的话什么是视觉SLAM视觉SLAM中所使用的摄像头传感器单目摄像头双目摄像头深度摄像头 经典视觉SLAM框架 写在前面的话 考研期间迷上了SLAM xff0c 买来了高翔 张涛等著的 视觉SLAM十四讲 从理
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • 敏捷开发:做一个合格的Scrum Master

    图片来源于网络 Scrum Master Beauty and Beast 在Scrum敏捷开发中有三种主要的角色 xff1a Product Owner xff08 产品负责人 xff0c 简称 34 PO 34 xff09 Scrum
  • 嵌入式软件:通过串口进行调试的一些思考和实践

    最近的工作还是改那坨代码 维护这摊东西也快要2年了 xff0c 好几次想重构它 xff0c 顺便整理一下 xff0c 不过我还是缺乏那种毅力 在这段时间里我还加了一些功能模块 xff0c 估计如果以后有新人接手这摊东西 xff0c 会抱怨这
  • 串口调试助手没有显示

    用cubeMX生成工程之后 xff0c 笔者写了下面两句话 xff08 向串口发送一个字符串 xff09 xff1a 但是 xff0c 打开调试工具怎么也接受不到数据 xff0c 魔术棒里面的 芯片型号 xff0c 调试 xff08 J L
  • vscode使用gitee

    vscode使用gitee 首先选择文件夹右键用vscode打开 然后打开vscode的终端 xff1a 在终端输入命令 xff1a xff08 每行命令输入完成之后记得敲回车 xff09 xff1a git init然后敲回车就有 xff
  • 深度揭秘阿里(蚂蚁金服)技术面试流程!附前期准备,学习方向

    上半年公司的项目很闲 xff0c 很多人觉得没意思陆续走了 xff0c 我考虑到自己的发展 xff0c 从6月底开始面 xff0c 面到7月底 xff0c 三十家公司 我从不打没准备的仗 xff0c 我是一个喜欢总结经验的人 xff0c 每
  • Git 中submodule的使用,终于有人说明白了

    背景 面对比较复杂的项目 xff0c 我们有可能会将代码根据功能拆解成不同的子模块 主项目对子模块有依赖关系 xff0c 却又并不关心子模块的内部开发流程细节 这种情况下 xff0c 通常不会把所有源码都放在同一个 Git 仓库中 有一种比
  • git 工具GitEye使用

    二 xff1a 签入 右键commit 可以选择需要签入的 xff0c 要加入注释才能签入 一 xff1a 比较
  • ROS笔记十(基于Python、Kinetic):rviz基础——快速配置并渲染点云和摄像机图像数据

    前言 xff1a rviz xff08 ROS visualization xff09 xff1a 用于机器人 传感器和算法的通用3D可视化系统 rviz能够绘制多种类型的数据流 特别是三维的数据 在ROS中所有类型的数据都被关联到一个参考
  • java面试必看书单

    编程之法 https legacy gitbook com book wizardforcel the art of programming by july details 白话经典算法之七大排序 链接 xff1a https pan ba
  • Java基础 - Integer和int的区别

    一 int和Integer的区别 两者的区别主要体现在以下几个方面 xff1a 1 数据类型不同 xff1a int 是基础数据类型 xff0c 而 Integer 是包装数据类型 xff1b 2 默认值不同 xff1a int 的默认值是
  • Lua + GraphicsMagick安装

    Lua 43 GraphicsMagick安装 图片的实时缩放功能是Nginx调用Lua脚本 xff0c Lua脚本在FastDFS中下载对应的图片保存到本地 xff0c 然后Lua调用GraphicsMagick实现图片的缩放功能 1 安