设为首页 收藏本站
查看: 5557|回复: 0

[经验分享] nginx+lua+image实现上传图片裁剪和加水印

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-1-28 08:40:47 | 显示全部楼层 |阅读模式
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

    convert_bin imagemagick_install_path/bin/convert

    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/2014 ... 6411357_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配置

[iyunv@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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-41585-1-1.html 上篇帖子: nginx平滑升级 下篇帖子: CentOS 环境利用 Nginx搭建服务器下载功能 图片
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表