nginx-lua-openresty-graphicsmagick 下载远程图片,本地缩图红缓存加水印 大结局
来源:互联网 发布:百度seo排名优化软件 编辑:程序博客网 时间:2024/04/28 04:08
先上全部代码吧
nginx.conf
worker_processes auto;user hubs;# 日志级别调试时可设为notice,生产环境请设为errorerror_log /usr/local/openresty/nginx/logs/error.log notice;events { use epoll; worker_connections 51200; multi_accept on; }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; lua_package_path '/usr/local/openresty/nginx/lua/?.lua;;'; lua_shared_dict imgsrv_locks 10m; #Shared memory segment for locking mechanism lua_shared_dict imgsrv_cache 50m; server { listen 80; server_name wnew.tt; #root /home/hubs/桌面/html; root /opt/lampp/htdocs/wowo-new/public; #/thumbnail目录下的图片请求不经过缩略图模块 # location ^~ /imgcache/ { # } # lua_code_cache off ; location / { #开启ssi支持shtml ssi on; ssi_silent_errors on; ssi_types text/shtml; index index.shtml index.php index.htm index.html; #框架路由设置 if ( !-e $request_filename ) { rewrite ^(.*)$ /index.php?url=$1 last; } } location ~\.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #对类似_100x100.gif/jpg/png/jpeg进行缩略图处理 location ~*(.*)\/(.*)\.(gif|jpg|png|jpeg)@([0-9]+)x([0-9]+)\.(gif|jpg|png|jpeg)$ { #匹配文件名规则 set $remote_url "https://wowoyoo.com$1/$2.$3"; #visit url # set $src_save_root "/home/hubs/桌面/html"; set $src_save_root "/opt/lampp/htdocs/wowo-new/public"; set $src_save_file_path "$src_save_root$1/$2.$3"; #save filename set $thumbnail_root "$src_save_root"; #缩略图存放目录 set $thumb_file "$thumbnail_root$uri"; #如果缩略图文件存在,直接返回 set $type 1 ; #如果缩略图文件不存在,则应用缩略图模块处理 if (!-f $thumb_file) { rewrite_by_lua_file lua/build.lua; } } location ~*(.*)\/(.*)\.(gif|jpg|png|jpeg)$ { #匹配文件名规则 set $remote_url "https://wowoyoo.com$1/$2.$3"; #visit url #set $src_save_root "/home/hubs/桌面/html"; set $src_save_root "/opt/lampp/htdocs/wowo-new/public"; set $src_save_file_path "$src_save_root$1/$2.$3"; #save filename set $type 2 ; #如果缩略图文件不存在,则应用缩略图模块处理 if (!-f $src_save_file_path) { rewrite_by_lua_file lua/build.lua; } } }}
build_config.lua
-- nginx thumbnail module -- last update : 2014/8/21-- version : 0.4.1module(...,package.seeall)--[[enabled_log:是否打开日志lua_log_level:日志记录级别gm_path:graphicsmagick安装目录img_background_color:填充背景色enabled_default_img:是否显示默认图片default_img_uri:默认图片链接default_uri_reg:缩略图正则匹配模式,可自定义_[0-9]+x[0-9]对应:001_100x100.jpg_[0-9]+x[0-9]+[.jpg|.png|.gif]+ 对应:001.jpg_100x100.jpg]]enabled_log = falselua_log_level = ngx.NOTICEgm_path = '/usr/bin/gm'img_background_color = 'white'enabled_default_img = truedefault_img_uri = '/default/notfound.jpg' default_uri_reg = '@[0-9]+x[0-9]+[.jpg|.png|.gif]+' default_wh_reg = '@([0-9]+)x([0-9]+)' -- width-heightquality= 80 -- 质量direction = 'southeast' --位置warter_dissolve= 50 --百分比 warter_img_uri = '/default/water.png'--[[ 配置项,对目录、缩略图尺寸、裁剪类型进行配置,匹配后才进行缩略图处理1.sizes={'350x350'} 填充后保证等比缩图2.sizes={'300x300_'}等比缩放3.sizes={'50x50^'}裁剪等比缩放 (缺点:裁剪了图片的一部分)dir="/" 对应根目录,请放在default之前dir="default" 对应默认图片尺寸,当原图不存在时,请求该尺寸会以默认图片生成缩略图]]cfg = {{dir = '/',sizes = {'50x50^','100x100^','250x250^','300x300_^','350x350^','80x80^','120x120^'},},{dir = 'default',sizes = {'50x50^','100x100^','250x250^','300x300^','350x350^','80x80^'},}}
build.lua
-- nginx thumbnail module -- last update : 2014/8/21-- version : 0.4.1local lock = require 'resty.lock'local c = require 'build_config'local P = require("path")local src_save_file_path = ngx.var.src_save_file_path -- full file pathlocal remote_url = ngx.var.remote_urllocal ngx_img_root = ngx.var.src_save_root -- save rootlocal uri = ngx.var.urilocal ntype = ngx.var.typefunction print_log (msg,log_level) log_level = log_level or c.lua_log_level if(c.enabled_log) then ngx.log(log_level,msg) endend-- must before print_log underlocal fetch = require 'build_fetch'local thumb = require 'build_thumb'local lockid = src_save_file_path-- get lock startlocal _lock = lock:new('imgsrv_locks',{timeout=03})local elapsed,err = _lock:lock(lockid)if not elapsed then print_log("Failed to acquire the lock : "..err) return false;endprint_log("---------------------------------------------------------------------------------LOCK ")-- get lock endlocal function start_thumb() local ngx_thumbnail_root = ngx.var.thumbnail_root -- thumb root local down = thumb.start_thumb(uri,ngx_img_root,ngx_thumbnail_root) if not down then local ok ,err = _lock:unlock() if not ok then print_log("failed start_thumb : "..err) return false end end return trueendlocal function start_fetch() local fok = fetch.start_fetch(remote_url,lockid) if not fok then local ok ,err = _lock:unlock() if not ok then print_log("failed start_fetch : "..err) return false end end return trueend local function start_unlock() local ok,err = _lock:unlock() print_log("--------------------------------------------------------------------------------- @@@@@@@@@@ UN LOCK ") if not ok then print_log("failed to unlock: "..err) return false end return fokend if ntype == 1 then print_log("ntype = "..ntype) -- exist src file if P.exists(lockid) then start_thumb() start_unlock() else start_fetch() start_thumb() start_unlock() endelse print_log("ntype 2 = "..ntype) if P.exists(lockid) then start_unlock() else start_fetch() start_unlock() end end
build_fetch.lua
-- https://phpb.com/portfolio/create-image-server-with-nginx-lua-openresty-graphicsmagick-part-ii/-- https://github.com/openresty/lua-resty-lock#for-cache-lockslocal _M = {} local P = require("path")local curl = require"cURL"local lfs = require 'lfs'local os = require 'os'local math = require 'math'local function mkdir(absdir)local temp_abs_dir = absdirlocal dir,base = P.split(temp_abs_dir)local dir_exist = P.isdir(temp_abs_dir)if dir_exist thenreturn trueendlocal temp_dir = P.isdir(dir)local temp_base = P.isdir(base)if temp_dir and not temp_base then local ok ,err= lfs.mkdir(temp_abs_dir)if not ok thenprint_log("temp_dir _ create 1: "..err)return falseendreturn okelsemkdir(dir)local ok ,err = lfs.mkdir(temp_abs_dir)if not ok thenprint_log("temp_dir _ create 2: "..err)return falseendreturn okendend_M.start_fetch = function(remote_url,save_file_path) local http_url = remote_url local temp_file = save_file_path..".temp" -- math.randomseed(os.time()) -- local temp_file = save_file_path.. math.random(100) local ok = mkdir(P.dirname(save_file_path)) if not ok then return false end local save_file = io.open(temp_file,"w+b") if not save_file then print_log("can't open tmpe_fiel = "..temp_file) return false end-- HTTP Getcurl.easy{ url = http_url, writefunction = save_file , } :perform():close()save_file:close()if P.isfile(temp_file) thenos.rename(temp_file,save_file_path)print_log("OK YES!! --------------------------------------------------------------------------------------------- down! ->")return trueelseprint_log("down fails --------------------------------------------------------------------------------------------- ! ="..http_url)os.remove(temp_file)return falseendendreturn _M;
build_thumb.lua
-- nginx thumbnail module -- last update : 2014/8/21-- version : 0.4.1local _M = {}local c = require 'build_config'--[[uri :链接地址,如/goods/0007/541/001_328x328.jpgngx_img_root :图片根目录ngx_thumbnail_root:缩略图根目录img_width :缩略图宽度 img_width :缩略图高度img_size :缩略图宽x高img_crop_type :缩略图裁剪类型cur_uri_reg_model :缩略图uri正则规则]]local img_width,img_height,img_size,img_crop_type = 0local cur_uri_reg = c.default_uri_reg--匹配链接对应缩略图规则local function contains(table,uri) local i = 1 img_crop_type = 0 for _, value in pairs(table) do local dir = value['dir'] local sizes = value['sizes'] local uri_reg = value['uri_reg'] _,_,img_width,img_height = string.find(uri,''..dir..'+.*'..c.default_wh_reg) if(img_width and img_height and img_crop_type==0) then img_size = img_width..'x'..img_height for _, value in pairs(sizes) do cur_uri_reg = uri_reg or cur_uri_reg if (img_size == value) then img_crop_type=1 return true elseif (img_size..'_' == value) then img_crop_type=2 return true elseif (img_size..'^' == value) then img_crop_type=3 return true end end end i=i+1 end return falseend-- 拼接gm命令-- /usr/bin/gm convert -quality 80 /usr/local/nginx/html/test/3.jpg -resize "300x300^" -gravity center -crop 300x300+0+0 -| -- gm composite -watermark 50 -gravity southeast /usr/local/nginx/html/default/water.png - /usr/local/nginx/html/imgcache/test.jpglocal function generate_gm_command(img_crop_type,img_original_path,img_size,img_thumbnail_path,img_warter_path)local cmd = c.gm_path .. ' convert -quality '.. c.quality..' '.. img_original_pathif (img_crop_type == 1) thencmd = cmd .. ' -thumbnail ' .. img_size .. ' -background ' .. c.img_background_color .. ' -gravity center -extent ' .. img_sizeelseif (img_crop_type == 2) thencmd = cmd .. ' -thumbnail ' .. img_sizeelseif (img_crop_type == 3) then--cmd = cmd .. ' -resize "' .. img_size .. '^" -gravity center -crop '..img_size.."+0+0" cmd = cmd .. ' -resize "' .. img_size .. '" -gravity center -crop '..img_size.."+0+0" elseprint_log('img_crop_type error:'..img_crop_type,ngx.ERR)return falseendlocal warter_cmd = c.gm_path .. ' composite -watermark '.. c.warter_dissolve..' -gravity southeast '.. img_warter_path..' - '..img_thumbnail_pathcmd = cmd .. ' - |' .. warter_cmdreturn cmdend_M.start_thumb = function(uri,ngx_img_root,ngx_thumbnail_root) if not contains(c.cfg, uri) then print_log(uri..' is not match! = ',ngx.ERR) return false else print_log(uri..' is match!') local img_original_uri = string.gsub(uri, cur_uri_reg, '') local img_exist = io.open(ngx_img_root .. img_original_uri) if not img_exist then if not c.enabled_default_img then print_log(img_original_uri..' is not exist top!',ngx.ERR) return false else img_exist=io.open(ngx_img_root .. c.default_img_uri) if img_exist then print_log(img_original_uri .. ' is not exist! crop image with default image') img_original_uri = c.default_img_uri else print_log(img_original_uri..' is not exist!',ngx.ERR) return false end end end local img_original_path = ngx_img_root .. img_original_uri local img_thumbnail_path = ngx_thumbnail_root .. uri local img_warter_path = ngx_img_root..c.warter_img_uri local gm_command = generate_gm_command(img_crop_type,img_original_path,img_size,img_thumbnail_path,img_warter_path) if (gm_command) then print_log('gm_command======'..gm_command) -- _,_,img_thumbnail_dir,img__thumbnail_filename=string.find(img_thumbnail_path,'(.-)([^/]*)$') -- os.execute('mkdir -p '..img_thumbnail_dir) os.execute(gm_command) return true end -- ngx.req.set_uri(uri) return false endendreturn _M
完工,参考文章
https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/if_else.html
https://phpb.com/portfolio/create-image-server-with-nginx-lua-openresty-graphicsmagick-part-ii/
- 安装依赖
#!/bin/shsudo /opt/openresty/luajit/bin/luarocks install graphicsmagick --server=https://raw.github.com/torch/rocks/mastersudo /opt/openresty/luajit/bin/luarocks install Lua-cURL --server=https://rocks.moonscript.org/devsudo /opt/openresty/luajit/bin/luarocks install lua-resty-readurlsudo /opt/openresty/luajit/bin/luarocks install luafilesystemsudo /opt/openresty/luajit/bin/luarocks install lua-path
- 来源: http://hihubs.com/article/270
0 0
- nginx-lua-openresty-graphicsmagick 下载远程图片,本地缩图红缓存加水印 大结局
- OpenResty(Nginx)+Lua+GraphicsMagick实现图片截图与缓存 二
- OpenResty(Nginx)+Lua+GraphicsMagick实现缩略图功能
- OpenResty(Nginx)+Lua+GraphicsMagick实现缩略图功能
- 保存远程图片到本地并加水印
- nginx+lua+GraphicsMagick做实时图片裁剪
- nginx+lua+GraphicsMagick实现图片自动缩放功能(强烈推荐)
- Nginx+Lua+GraphicsMagick实现动态生成指定尺寸的图片
- 看看 Nginx + Lua (OpenResty)
- Openresty (nginx + lua)
- Nginx+Lua(OpenResty) HelloWorld
- OpenResty(Nginx+Lua)
- .NET上传缩略图加文字和水印图片,下载远程图片
- nginx-lua-fastdfs-GraphicsMagick整合
- php批量下载图片并加水印
- nginx+lua+redis(openresty)配置
- openresty 安装nginx和lua
- OpenResty(nginx+lua) 开发入门
- Installing TensorFlow on Windows
- Android Studio 快捷键 for Mac OS X
- Netty之Reactor线程2 -- NioEventLoop
- LayUI后台管理系统Java实现
- 《你不可不知的人性》刘墉 读书笔记(三)
- nginx-lua-openresty-graphicsmagick 下载远程图片,本地缩图红缓存加水印 大结局
- Android Values文件作用及使用方法
- 浅谈iframe的优缺点
- SQL 面试题第一季
- golang学习redis连接池实现
- MFC 消息发送机制
- var与let,const区别
- shell中的(),{}几种语法用法
- ant的bulid.xml文件写法