狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 !

使用 Tengine+Lua+GraphicsMagick 实现图片自动裁剪缩放

需求 : 图片处理

问题 : 

  • 互联网电商网站 ( PC, 移动)
  • 大量不同需求的图片 (同一个图片需要不同尺寸的缩略图)

解决方案(两种策略) : 

  • 在上传图片时 , 就生成所需缩略图
  • 根据请求指定尺寸的图片自动生成相应的缩略图片
    • Tengine+Lua+GraphicsMagick

Tengine+Lua+GraphicsMagick

  • Tengine

    • 淘宝优化改良的Nginx , 并集成了Lua模块
    • 负责展示图片和调度Lua脚本
  • Lua
    • 脚本语言 , 嵌入到应用程序中 , 提供灵活的扩展和定制功能
    • Tengine通过Lua实现对GM操作
    • 控制裁剪 , 缩放规格
  • GraphicsMagick
    • 强大的图片处理工具 , 没有UI的PS , 动态的生成图片 , 特别适用于互联网的应用
    • 负责图片的处理
  • 好处 :
    • 按需处理
    • 图片处理更加高效
    • GM支持高并发下的图片处理 , 有效的保证了性能

安装配置

软件列表

  • Tengine

    • 安装包 : tengine-master.zip
    • 下载地址 : https://github.com/alibaba/tengine
  • Lua
    • 安装包 : lua-5.3.1.tar.gz , LuaJIT-2.0.4.tar.gz (Lua依赖包)
    • 下载地址 : http://www.lua.org/ftp/ , http://luajit.org/download.html
  • GraphicsMagick
    • 安装包 : GraphicsMagick-1.3.18.tar.gz
    • 下载地址 : https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/
  • 依赖包和类库 , 可yum安装
    • libjpeg , libjpeg-devel
    • libpng , libpng-devel
    • giflib , giflib-devel
    • freetype , freetype-devel

安装

  • 源码安装---> ./configure   make   make install
  • yum安装--->  yum install ~
  1. Lua

    • 安装依赖 ( readline&readline-devel )
    • 安装Lua ( 源码编译安装 )
    • 安装LuaJIT ( 源码编译安装 )
  2. Tengine
    • 进入Tengine源码目录 , 使用Configure配置安装路径以及需要安装的模块
    • 安装Tengine ( 源码编译安装 )
      ./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
  3. GraphicsMagick
    • 安装依赖

      • libjpeg , libjpeg-devel
      • libpng , libpng-devel
      • giflib , giflib-devel
      • freetype , freetype-devel
    • 进入GM源码目录 , 使用configure配置安装路径以及需要安装的模板
    • 安装GM ( 源码编译安装 )
      ./configure --prefix=/usr/local/GraphicsMagick --enable-shared

配置

  • Lua 脚本文件  ( ImageResizer.lua )

    • 位置 : /usr/local/Tengine/lua/ImageResizer.lua
    • 权限 : 可执行 (chomd 777 /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);
  • Tengine 配置 ( nginx.config )
    #user  nobody;
    user  root;  # 裁剪图片需要root权限
    worker_processes  ;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    events {
        worker_connections  ;
    }
    
    # load modules compiled as Dynamic Shared Object (DSO)
    #
    #dso {
    #    load ngx_http_fastcgi_module.so;
    #    load ngx_http_rewrite_module.so;
    #}
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  ;
        keepalive_timeout  ;
    
        #gzip  on;
    
        server {
            listen       ;
            server_name  img.itrip.project.bdqn.cn;
            root /data/itrip/uploadimg;
    
            location / {
                 root /data/itrip/uploadimg; # 站点根目录
                 expires 1h;    # 缓存时间
                 add_header Cache-Control max-age=; # 缓存时间
                 access_log   /var/log/Tengine/host_access.log;
            }
    
            #如果 url 格式如:xxxx.gif_数字x数字.gif
            location ~* ^(.+\.(jpg|jpeg|gif|png))_(\d+)x(\d+)\.(jpg|jpeg|gif|png)$ {
               root /data/itrip/uploadimg;    #这里必须设置,否则根目录,即 $document_root 会是 Nginx 默认的 Nginx Root/html,在 Lua 中会得不到期望的值
               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;  #在编写外部 Lua脚本时,设置为off Nginx不会缓存 Lua,方便调试
                  set $request_filepath /data/itrip/uploadimg$;  #设置原始图片路径,如:/document_root/.gif
                  set $width $;     # 设置裁剪/缩放的宽度
                  set $height $;    # 设置裁剪/缩放的高度
                  set $ext $;      # 图片文件格式后缀
                  content_by_lua_file /usr/local/Tengine/lua/ImageResizer.lua;  #加载外部 Lua 文件
                }
            }
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            #location / {
            #    root   html;
            #    index  index.html index.htm;
            #}
    
            #error_page                /.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page        /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   ;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       ;
        #    listen       somename:;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
        # HTTPS server
        #
        #server {
        #    listen        ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }

Tengine+Lua+GraphicsMagick的更多相关文章

  1. Tengine + Lua + GraphicsMagick 实现图片自动裁剪/缩放

    http://my.oschina.net/eduosi/blog/169606

  2. tengine lua 开源一 调用内部接口高效发送文件

    tengine  lua 开源一 调用内部接口高效发送文件 开源自己封装的sendfile 模块,可以高效的通过lua发送文件 源码地址:https://github.com/weinyzhou/Lu ...

  3. tengine + lua 实现流量拷贝

    环境搭建参考地址:http://www.cnblogs.com/cp-miao/p/7505910.html cp.lua local res1, res2, action action = ngx. ...

  4. tengine+lua的安装步骤

    我是在Red Hat 5.8 的虚机上安装的. Nginx的一些模块需要其他第三方库的支持,例如gzip模块需要zlib库,rewrite模块需要pcre库,ssl功能需要openssl库等.建议把这 ...

  5. 【技术干货】听阿里云CDN安防技术专家金九讲tengine+lua开发

    一.介绍 二.安装 三.运行 四.开发 1.介绍 Tengine:轻量级.高性能.高并发.配置化.模块化.可扩展.可移植的Web和反向代理 服务器,Tengine是nginx超集,但做了很多优化,包含 ...

  6. OpenResty+lua+GraphicsMagick生成缩略图

    1.安装GraphicsMagick 下载地址:http://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/1.3.19/G ...

  7. OpenResty(Nginx)+Lua+GraphicsMagick实现缩略图功能

    http://www.hopesoft.org/blog/?p=1188 http://www.imagemagick.org/download/ 2.用法 原始图片是input.jpg,尺寸:160 ...

  8. 如何安装nginx_lua_module模块,升级nginx,nginx-lua-fastdfs-GraphicsMagick动态生成缩略图,实现图片自动裁剪缩放

    如何安装nginx_lua_module模块,升级nginx,nginx-lua-fastdfs-GraphicsMagick动态生成缩略图,实现图片自动裁剪缩放 参考网站:nginx-lua-fas ...

  9. nginx lua处理图片

    user apache apache; worker_processes 4; worker_rlimit_nofile 100000; #error_log logs/error.log; #err ...

随机推荐

  1. 如何在Window下安装node\npm\cnpm,并安装vue.js,创建项目

    1.安装node.js node.js的官方地址为:https://nodejs.org/en/download/. 根据windows版本后,选择要下载的安装包,下载完毕,按照windows一般应用 ...

  2. vuedraggable(vue2.0)组件详解

    github地址 安装 yarn add vuedraggable npm i -S vuedraggable 使用方式 通常 <draggable v-model="myArray& ...

  3. 前端Vue 源码分析-逻辑层

    Vue 源码分析-逻辑层 预期的效果: 监听input的输入,input在输入的时候,会触发 watch与computed函数,并且会更新原始的input的数值.所以直接跟input相关的处理就有3处 ...

  4. Improved dual-mode compressive tracking integrating balanced colour and texture features

    <改进的集成平衡颜色和纹理特征的双模压缩跟踪> 摘要:将跟踪问题视为分析目标和背景信息的分类问题的判别跟踪方法可以实现最先进的性能.作为一个高性能判别器,压缩跟踪近来受到很多关注.然而,当 ...

  5. java学习 之 java基本数据类型

    java 8个基本数据类型 public class BasicDataType { public static void main(String args[]) { //数据类型 //Byte Sy ...

  6. Java判断水仙花数

    水仙花数 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI).自恋数.自幂数.阿姆斯壮数或阿姆斯特朗数( ...

  7. synchronized 是可重入锁吗?为什么?

    什么是可重入锁? 关于什么是可重入锁,我们先来看一段维基百科的定义. 若一个程序或子程序可以“在任意时刻被中断然后操作系统调度执行另外一段代码,这段代码又调用了该子程序不会出错”,则称其为可重入(re ...

  8. cmd下,regsvr32不是内部或外部命令

    https://jingyan.baidu.com/article/48b37f8d2fb1aa1a646488cc.html

  9. [原创]Zynq AXI-CDMA测试结果

    经过研究与demo,在zynq上使用axi-cmda效率还是很高,测试报告如下所示 对于读取32KB,GP0和HP0的测试结果如下:

  10. 扩展crt

    题解: 很久之前写过一篇..但好像写的不太正常 就重新写一篇 对于质数有一种朴素的crt合并 但其实那个没啥用..那个能做的扩展crt都能做 并且那个好像不能动态加方程组 所以就会扩展crt就行了 扩 ...