电商类网站 图片自动生成不同尺寸缩略图策略(Tengine + Lua + GraphisMargick)
场景分析
在进行电商类网站开发时, 常常需要对一图片进行不同尺寸展示, 如果仅仅依靠手工调整,工作量十分巨大, 为此需要一个自动处理的技术来实现这个功能 t
即Tengine + Lua + GraphisMargicTk
- 简单介绍:
-
Tengine: 淘宝优化改良的Nginx, 并集成了Lua模块 负责图片的展示和调度Lua脚本
-
脚本语言 嵌入到程序中, 提供灵活的定制功能 Tengine通过Lua实现对GM操作 进行控制裁剪 和缩放规格
-
GraphicsMagick
强大的图片处理工具 , 不依赖UI的ps 动态生成图片
支持高并发场景下的性能需求
-
安装使用:
-
Tengine
-
注 tengine安装有点繁琐 仔细配置
-
使用configure安装 直接复制这段命令 如果提示权限不足
chmod 777 configure
./configure --prefix=/usr/local/Tengine --dso-path=/usr/local/Tengine/modules --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_concat_module --with-http_lua_module --http-proxy-temp-path=/var/tmp/Tengine/proxy_temp --http-fastcgi-temp-path=/var/tmp/Tengine/fastcgi_temp --http-uwsgi-temp-path=/var/tmp/Tengine/uwsgi_temp --http-scgi-temp-path=/var/tmp/Tengine/cgi_temp --http-client-body-temp-path=/var/tmp/Tengine/client_body_temp --http-log-path=/var/log/Tengine/access.log --error-log-path=/var/log/Tengine/error.log
1.2 make
1.3 make install
1.4 启动 和Nignx启动方式很像
/usr/local/Tengine/sbin/nginx
如果报错
error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directoryerror
执行: ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2 (注意空格 以及你出错提示的那个文件版本 我这是5.1)
1.5 如果还有报错 根据提示可以自行处理
1.6 重新执行启动命令 看到如下图说明Tengine安装成功
-
Lua
LuaJIT-2.0.4.tar.gz
-
相关依赖
- yum install readline
- yum install readline-devel
-
解压后安装lua 和 luaJIT
1.make linux
2.make install (这里如果报错 按照提示删除一个文件)
-
测试
输入 lua -v 看看能否输出版本信息 能即成功
-
-
GraphicsMagick
-
安装相关依赖
-
libjpeg libjpeg-devel
-
libpng libpng-devel
-
giflib giflib-devel
-
freetype freetype-devel
-
-
进入该目录configure安装
1.1 命令 ./configure --prefix=/usr/local/GraphicsMagick --enable-shared
1.2 make
1.3 make install
1.4 检验是否成功 /usr/local/GraphicsMagick/bin/gm version 看看能否输出版本信息
核心配置
Lua脚本文件
- 位置 /usr/local/Tengine/lua/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);
-
+ 授权为可执行的文件 因为lua以后要交给Tengine来操作 所以进行如下
chmod 777 /usr/local/Tengine/lua/ImageResizer.lua
Tengine配置
1.进入配置文件 添加user root
2.server节点中添加 如下配置
location / { root /data/itrip/uploadimg; # 站点根目录 expires 1h; add_header Cache-Control max-age=3600; # 缓存时间 access_log /var/log/Tengine/host_access.log; } location ~* ^(.+\.(jpg|jpeg|gif|png))_(\d+)x(\d+)\.(jpg|jpeg|gif|png)$ { root /data/itrip/uploadimg; if (!-f $request_filename) { add_header X-Powered-By 'Lua GraphicsMagick'; #此HTTP Header无实际意义,用于测试 add_header file-path $request_filename; #此 HTTP Header无实际意义,用于测试 lua_code_cache on; set $request_filepath /data/itrip/uploadimg$1; set $width $3; set $height $4; set $ext $5; content_by_lua_file /usr/local/Tengine/lua/ImageResizer.lua; } }
-
重启nginx
-
在上面配置文件提到的路径 放置一个测试图片 然后访问Tengine 如下图
5.现在我们变更需求 换一个尺寸 60x60
如下图
OK 至此 大功告成
在对各个依赖和安装包 解压 安装时需要注意都要 进入该目录下 否则就会提示命令不存在之类, 此外每一步都要慢慢来 不急于看结果