nginx+lua+image实现上传图片裁剪和加水印

简介:

https://github.com/openresty/lua-nginx-module

https://github.com/simpl/ngx_devel_kit

Lua JIT

http://luajit.org/download.html

configure \
...
--add-module=/path/lua-nginx-module \
--add-module=/path/ngx_devel_kit 

make && make install

ImageMagick

http://www.imagemagick.org/

Modify

nginx-server.conf

  1. convert_bin imagemagick_install_path/bin/convert

  2. rewrite_by_lua_file nginx-imagemagick.lua save path

if want to allow more image size, please modify the image_sizes variable in nginx-imagemagick.lua


server

{


    listen       80;

    server_name upload.qq.com;

    index index.html index.htm index.php;

    root  /h1/upload.qq.com;

   location ~ ^(.+\.php)(.*)$ {  

        fastcgi_pass 127.0.0.1:9000;

        fastcgi_index index.php; 

        fastcgi_split_path_info ^(.+\.php)(.*)$;  

        fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;

        fastcgi_param PATH_INFO $fastcgi_path_info; 

        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

         include fcgi.conf;  

        }

rewrite ^/attachment/image/(.*).jpg$  /attachment/image/$1.jpg!0x0 last;#处理原始图显示为0x0图

       # rewrite ^/images/(.*).jpg  ^/images/$1.jpg!0x0 last;  

         location /attachment/image/ {

                set $image_root "/htdoc/upload.qq.com";

                set $file "$image_root$uri";

                set $convert_bin "/usr/local/bin/convert";

               if (!-f $file)

                {

                        rewrite_by_lua_file /usr/local/webserver/nginx/conf/nginx-imagemagick.lua;

                }

                expires max;

        }



        location ~ .*\.(js|css)?$

        {

                expires max;

        }


}

下面是lua代码 nginx-imagemagick.lua:


-- http://domain.com/111/photo/201411/05/5459e306820af926411357_320x320.jpg


-- config

local image_sizes = { "640x640", "320x320", "124x124", "140x140", "64x64", "60x60", "32x32", "0x0" }



-- parse uri

function parseUri(uri)

    local _, _, name, ext, size = string.find(uri, "(.+)(%..+)!(%d+x%d+)")

 --ngx.header.content_type = "text/plain";

    --ngx.say(name,size);

    if name and size and ext then

        return ngx.var.image_root .. name .. ext, size

    else

        return "",""

    end

end


function fileExists(name)

    local f = io.open(name, "r")

    if f ~= nil then

        io.close(f)

        return true

    else

        return false

    end

end

 --ngx.header.content_type = "text/plain";

    --ngx.say(name);

function sizeExists(size)

    for _, value in pairs(image_sizes) do

        if value == size then

            return true

        end

    end


    return false

end

 --ngx.header.content_type = "text/plain";

    --ngx.say(size);

function resize()

    local ori_filename, size = parseUri(ngx.var.uri)

--ngx.header.content_type = "text/plain";

    --ngx.say(ori_filename,size);

    if fileExists(ori_filename) == false or sizeExists(size) == false then

        ngx.exit(404)

    end


     local command = '';

    if size == '0x0' then

        command = table.concat({

            ngx.var.convert_bin,

            ori_filename,

            "/usr/local/webserver/nginx/conf/logo.png",

            "-gravity southeast -geometry +5+10 -composite",

            ngx.var.file,

        }, " ")

    else

        command = table.concat({

            ngx.var.convert_bin,

            ori_filename,

            "/usr/local/webserver/nginx/conf/logo.png",

            "-gravity southeast -geometry +5+10 -composite -resize",

            size,

            ngx.var.file,

        }, " ")

    end

--ngx.header.content_type = "text/plain";

    --ngx.say(command);

    os.execute(command)

end

 --ngx.header.content_type = "text/plain";

   --ngx.say(command);

resize()



再下面是nginx的mime配置

[root@localhost conf]# cat mime.types


types {

    text/html                             html htm shtml;

    text/css                              css;

    text/xml                              xml plist;

    image/gif                             gif gif!320x320 gif!64x64 gif!140x140;

    image/jpeg                            jpeg jpg jpg!320x320 jpg!64x64 jpg!140x140 jpg!200x200 jpg!0x0;



结果地址  http://upload.qq.com/images/13.jpg(原始图) 

http://upload.qq.com/images/13.jpg!0x0 (缩略图)

 http://upload.qq.com/images/13.jpg!64x64(缩略图)

 http://upload.qq.com/images/13.jpg!320x320 (缩略图)

尺寸自己定义

/usr/local/webserver/nginx/conf/logo.png 这个是水印图 


手动测试图片处理在系统里执行 

convert src.jpg logo.gif -gravity southeast -geometry +5+10 -composite dest.jpg



本文转自 liang3391 51CTO博客,原文链接:http://blog.51cto.com/liang3391/1608878

相关文章
|
8月前
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(下)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
87 0
9kr
|
应用服务中间件 网络安全 nginx
通过宝塔Nginx反代HomeAssistant并添加SSL实现隐藏端口号与域名访问
HomeAssistant默认使用8123端口,带端口访问既不美观也不方便。 通过宝塔Nginx默认反代配置会出现各种意外错误,本文将通过修改HomeAssistant与反代配置解决该问题。
9kr
2947 1
通过宝塔Nginx反代HomeAssistant并添加SSL实现隐藏端口号与域名访问
|
7月前
|
算法 NoSQL Java
分布式接口幂等性、分布式限流(Guava 、nginx和lua限流)
接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。
|
8月前
|
缓存 NoSQL 应用服务中间件
基于Nginx+Lua优化多级缓存架构
基于Nginx+Lua优化多级缓存架构
120 0
|
8月前
|
负载均衡 应用服务中间件 测试技术
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(上)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
334 0
|
存储 Java 应用服务中间件
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
|
存储 网络协议 Java
内存池组件以及根据nginx内存池源码设计实现简易内存池
内存池组件以及根据nginx内存池源码设计实现简易内存池
内存池组件以及根据nginx内存池源码设计实现简易内存池
|
SQL 负载均衡 应用服务中间件
nginx安装 、分发实现多域名访问同一主机不同端口
nginx安装 、分发实现多域名访问同一主机不同端口
835 0
nginx安装 、分发实现多域名访问同一主机不同端口
|
应用服务中间件 程序员 Linux
CentOS 上部署Nginx实现http301重定向https配置文件conf
CentOS 上部署Nginx实现http301重定向https配置文件conf
325 0
|
监控 数据可视化 应用服务中间件
Nginx系列:用GoAccess实现可视化并实时监控access日志
Nginx系列:用GoAccess实现可视化并实时监控access日志
288 0
Nginx系列:用GoAccess实现可视化并实时监控access日志