Tengine+Lua+GraphicsMagick动态裁剪图片

安装Lua

先安装依赖:

1  
yum install readline readline-devel -y  

—|—

解压文件

1  
tar -zxvf lua-5.3.1.tar.gz  

—|—

进入目录,执行:

1  
2  
cd lua-5.3.1  
make linux && make install  

—|—

验证安装成功:

1  
lua -v  

—|—

安装luaJIT

解压文件

1  
tar -zxvf LuaJIT-2.0.4.tar.gz  

—|—

进入目录,执行:

1  
2  
cd LuaJIT-2.0.4  
make && make install  

—|—

安装tengine

安装依赖:

1  
yum -y install pcre-devel openssl openssl-devel  

—|—

解压文件:

1  
unzip tengine-master.zip  

—|—

进入目录,执行:

1  
2  
3  
cd tengine-master  
  
./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  
make && make install  

—|—

验证安装成功:

1  
2  
$ /usr/local/Tengine/sbin/nginx  
/usr/local/Tengine/sbin/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory  

—|—

提示找不到文件,配置一个软连接:

1  
ln -s /usr/local/lib/libluajit-5.1.so.2  

—|—

验证安装成功:

1  
2  
$ /usr/local/Tengine/sbin/nginx  
nginx: [emerg] mkdir() "/var/tmp/Tengine/client_body_temp" failed (2: No such file or directory)  

—|—

手动创建该目录:

1  
mkdir -p /var/tmp/Tengine/client_body_temp  

—|—

然后,访问 http://192.168.56.100/ ,可以看到:

1  
Welcome to tengine!  

—|—

安装GraphicsMagick

安装依赖:

1  
yum install libjpeg libjpeg-devel libpng libpng-devel giflib giflib-devel freetype freetype-devel -y  

—|—

解压文件

1  
tar -zxvf GraphicsMagick-1.3.18.tar.gz  

—|—

进入目录,执行:

1  
2  
cd GraphicsMagick-1.3.18  
./configure --prefix=/usr/local/GraphicsMagick --enable-shared  

—|—

再编译安装:

1  
make && make install  

—|—

验证安装成功:

1  
/usr/local/GraphicsMagick/bin/gm version  

—|—

配置

创建 ImageResizer.lua 文件:

1  
2  
mkdir /usr/local/Tengine/lua/  
touch /usr/local/Tengine/lua/ImageResizer.lua  

—|—

ImageResizer.lua:

1  
2  
3  
4  
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);  

—|—

修改 /usr/local/Tengine/conf/nginx.conf:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
user  root;  # 裁剪图片需要root权限  
worker_processes  1;  
  
events {  
    worker_connections  1024;  
}  
  
http {  
    include       mime.types;  
    default_type  application/octet-stream;  
  
    sendfile        on;  
    #tcp_nopush     on;  
  
    keepalive_timeout  65;  
  
    server {  
        listen       80;  
        server_name  img.javachen.com;  
        root /data/image/upload;  
  
        location / {  
             root /data/image/upload; # 站点根目录  
             expires 1h;    # 缓存时间  
             add_header Cache-Control max-age=3600; # 缓存时间  
             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/image/upload;    #这里必须设置,否则根目录,即 $document_root 会是 Nginx 默认的 Nginx Root/html,在 Lua 中会得不到期望的值  
           if (!-f $request_filename) { #如果文件不存在时才需要裁剪  
              #此HTTP Header无实际意义,用于测试  
              add_header X-Powered-By 'Lua GraphicsMagick';    
              #此 HTTP Header无实际意义,用于测试  
              add_header file-path $request_filename;    
  
              #在编写外部 Lua脚本时,设置为off Nginx不会缓存   
              lua_code_cache on;  Lua,方便调试  
              #设置原始图片路径,如:/document_root/1.gif  
              set $request_filepath /data/image/upload$1;    
              set $width $3;     # 设置裁剪/缩放的宽度  
              set $height $4;    # 设置裁剪/缩放的高度  
              set $ext $5;      # 图片文件格式后缀  
  
              #加载外部 Lua 文件  
              content_by_lua_file /usr/local/Tengine/lua/ImageResizer.lua;    
            }  
        }  
  
        error_page   500 502 503 504  /50x.html;  
        location = /50x.html {  
            root   html;  
        }  
    }  
}  

—|—

重新加载配置文件:

1  
/usr/local/Tengine/sbin/nginx -s reload  

—|—

创建图片上传目录:

1  
mkdir -p  /data/image/upload  

—|—

配置hosts:

1  
192.168.56.100  img.javachen.com  

—|—

在 /data/image/upload 下存放一个图片 1.png,然后访问:http://192.168.56.100/1.png,再访问缩放图片:http://192.168.56.100/1.png_245x245.png

查看 /data/image/upload 目录是否有生成新的文件:

1  
2  
$ ll /data/image/upload/  
1.png  1.png_145x145.png  1.png_245x245.png  1.png_45x45.png  

—|—

糖果

糖果
LUA教程

Lapis框架的常用处理方法

Lapis框架的常用处理方法 Continue reading

MoonScript实现选择排序

Published on February 26, 2017

MoonScript与Redis客户端

Published on January 19, 2017