`
xly_971223
  • 浏览: 1277399 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx lua处理图片

 
阅读更多
nginx配置
user  apache apache;
worker_processes  4;
worker_rlimit_nofile 100000;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
        use epoll;
        multi_accept on;
        worker_connections 51200;
}

# load modules compiled as Dynamic Shared Object (DSO)
#
dso {
#    load ngx_http_fastcgi_module.so;
#    load ngx_http_rewrite_module.so;
}

http
   {
        server_tokens off;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    tcp_nopush on;
     keepalive_timeout  20;

     server_names_hash_bucket_size 128;
     client_header_buffer_size    4k;
     large_client_header_buffers 4 32k;
     client_body_buffer_size  512k;
     client_max_body_size 20m;
     gzip  on;
     gzip_disable "msie6";
     gzip_min_length 1k;
     gzip_buffers 16 64k;
     gzip_http_version 1.1;
     gzip_comp_level 6;
     gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript;
     gzip_vary on;

        lua_package_path '/usr/local/tengine/lua/?.lua;;';

    upstream tomcat_server {
        ip_hash;
         server 172.16.151.112:6080 ;
         server 172.16.151.113:6080 ;
#        server 172.16.151.235 max_fails=2 fail_timeout=30s;
            }


        server {
                listen       80;
                server_name  image0.lovebuy.com.cn;
#                root  /usr/html/lovebuy;


         location =  / {
            root    /usr/html/lovebuy/html;
            index index.html;
        }

        location ~ ^/index.html$ {
            root /usr/html/lovebuy/html;
        }

        location ^~ /subject/ {
            root /usr/html/lovebuy/html;
        }

#        location ~ ^/goods_(\d\d\d).html$ {
#
#       if (-f $request_filename) {
#             root /usr/html/lovebuy/html;
#            rewrite ^/goods_(\d\d).html$  /page0$1/goods_0$1.html break;
#       rewrite ^/goods_(\d+).html$  /page$1/goods_$1.html break;
#       }
#
#       if (!-f $request_filename) { 
#       # rewrite ^/goods_(\d+).html  http://www.lovebuy.com.cn/goods_3784.html permanent;
#        rewrite ^/goods_(\d+).html  http://172.16.151.112:6080/goods_$1.htm permanent;
#       }
#       proxy_set_header Host $host;
#       proxy_set_header X-Forwarded-For $remote_addr;
#       proxy_pass http://tomcat_server;
#        }


        location ~ ^/goods_(.*)(\d\d\d).html$ {

            root /usr/html/lovebuy/html/page$2/;

        if (-f $request_filename) {
        rewrite ^/goods_(.*)(\d\d\d).html$  /goods_$1$2.html break;
        }

        if (!-f $request_filename) {
        rewrite ^/goods_(\d+).html  http://$host/goods_$1.htm ;
#       proxy_pass http://tomcat_server ;
        }
#       proxy_set_header Host $host;
#        proxy_set_header X-Forwarded-For $remote_addr;
#        proxy_pass http://tomcat_server;
        }

#        location ~ ^/goods_(.*)(\d\d\d).html$ {
#
#            root /usr/html/lovebuy/html;
#       rewrite ^/goods_(.*)(\d\d\d).html$  /page$2/goods_$1$2.html break;
#        }


#/thumbnail目录下的图片请求不经过缩略图模块
                location ^~ /thumbnail/ {
                root /usr/html/lovebuy/upload;

                }


                location /lua {
        default_type 'text/plain';
        content_by_lua 'ngx.say("hello, lua")';
                }

#########################################################                
                #对类似_100x100.gif/jpg/png/jpeg进行缩略图处理
                location ~* _([0-9]+)x([0-9]+)\.(gif|jpg|png|jpeg)$ {                   #匹配文件名规则
#                location ^~ /photo/                                 {                   #匹配文件名规则
                       rewrite ^/(upload/)(.*)$ /$2 last;
                        root /usr/html/lovebuy/upload;                             #点根目录
                        lua_code_cache off;
                        set $image_root /usr/html/lovebuy/upload;                   #图片目录
                        set $thumbnail_root /usr/html/lovebuy/upload/thumbnail;     #缩略图存放目录
                        #果缩略图文件存在,直接返回
                        set $file $thumbnail_root$uri;
                        if (-f $file) {
                                rewrite ^/(.*)$ /thumbnail/$1 last;
                        }

#果缩略图文件不存在,则应用缩略图模块处理
                        if (!-f $file) {
                                rewrite_by_lua_file /usr/local/tengine/lua/thumbnail.lua;
#                                rewrite_by_lua '
#                               local command = "/usr/local/GraphicsMagick/bin/gm convert /usr/local/tengine/html/image/photo/2m.jpg /usr/local/tengine/html/image/photo/2m_300x300.jpg" ;
#                               os.execute(command);

#                       ';                                
                                }

                }
        location /nginx-status {
        stub_status on;
        access_log off;
        #加入访问限制
        #allow 60.195.252.106;
        allow 172.16.151.83;
        #deny all;
                }
##################缓存配置###############################3
 location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
           root    /usr/html/lovebuy/;
           expires 1d;

       }

 location ^~ /resources/ {
           root    /usr/html/lovebuy/;
           expires 30d;

       }







###################缓存配置-end##########################
        location / {
            concat on; #开启concat模块
            root    /usr/html/lovebuy/;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
      
  

lua文件
-- nginx thumbnail module 
-- last update : 2014/8/21
-- version     : 0.4.1

local c  = require 'config'

--[[
	uri               :链接地址,如/goods/0007/541/001_328x328.jpg
	ngx_img_root      :图片根目录
	ngx_thumbnail_root:缩略图根目录
	img_width         :缩略图宽度 
	img_width         :缩略图高度
	img_size          :缩略图宽x高
	img_crop_type     :缩略图裁剪类型
	cur_uri_reg_model :缩略图uri正则规则
]]
local uri = ngx.var.uri
local ngx_img_root = ngx.var.image_root
local ngx_thumbnail_root = ngx.var.thumbnail_root
local img_width,img_height,img_size,img_crop_type = 0
local cur_uri_reg = c.default_uri_reg

--[[
	日志函数
	log_level: 默认为ngx.NOTICE
	取值范围:ngx.STDERR , ngx.EMERG , ngx.ALERT , ngx.CRIT , ngx.ERR , ngx.WARN , ngx.NOTICE , ngx.INFO , ngx.DEBUG
	请配合nginx.conf中error_log的日志级别使用
]]
function lua_log(msg,log_level)
	log_level = log_level or c.lua_log_level
    if(c.enabled_log) then 
		ngx.log(log_level,msg) 
	end
end

--	匹配链接对应缩略图规则
function table.contains(table,element)
	local i = 1
	img_crop_type = 0		
    for _, value in pairs(c.cfg) do
        local dir = value['dir']
        local sizes = value['sizes']
	local uri_reg = value['uri_reg']
        _,_,img_width,img_height = string.find(uri,''..dir..'+.*_([0-9]+)x([0-9]+)')
        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
				if(uri_reg) then
					lua_log('value[uri_reg]==='..uri_reg)
				else
					lua_log('value[uri_reg]===nil,dir='..dir..',cur_uri_reg='..cur_uri_reg)
				end
				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
                elseif (img_size..'^' == value) then
                    img_crop_type=4
                    return true
                elseif (img_size..'>' == value) then
                    img_crop_type=5
                    return true
                elseif (img_size..'$' == value) then
                    img_crop_type=6
                    img_size = img_width..'x'
                    return true	
                end
            end	
        end		
		i=i+1	
    end
    return false
end

-- 拼接gm命令
local function generate_gm_command(img_crop_type,img_original_path,img_size,img_thumbnail_path)
	local cmd = c.gm_path .. ' convert ' .. img_original_path
	if (img_crop_type == 1) then
		cmd = cmd .. ' -thumbnail '  .. img_size .. ' -background ' .. c.img_background_color .. ' -gravity center -extent ' .. img_size
	elseif (img_crop_type == 2) then
		cmd = cmd .. ' -thumbnail "'  .. img_size .. '" +profile "*"' 
	elseif (img_crop_type == 3) then
		cmd = cmd .. ' -thumbnail "'  .. img_size .. '!" -extent ' .. img_size
	elseif (img_crop_type == 4) then
		cmd = cmd .. ' -thumbnail "'  .. img_size .. '^" -extent ' .. img_size
	elseif (img_crop_type == 5 or img_crop_type == 6) then
		cmd = cmd .. ' -thumbnail "'  .. img_size .. '>" +profile "*"'
	else
		lua_log('img_crop_type error:'..img_crop_type,ngx.ERR)
		ngx.exit(404)
	end	
	cmd = cmd .. ' ' .. img_thumbnail_path
	return cmd
end

lua_log("ngx_thumbnail_root======="..ngx_thumbnail_root)
--对照配置文件规定的图片尺寸	
if not table.contains(c.cfg, uri) then
    lua_log(uri..' is not match!',ngx.ERR)
    ngx.exit(404)
else
    lua_log(uri..' is match!',ngx.ERR)
	local img_original_uri = string.gsub(uri, cur_uri_reg, '')
	lua_log('img_original_uri_old===' .. uri,ngx.ERR)
	lua_log('cur_uri_reg===' .. cur_uri_reg,ngx.ERR)	
	lua_log('img_original_uri_new===' .. img_original_uri,ngx.ERR)
	local img_exist=io.open(ngx_img_root .. img_original_uri)
	if not img_exist then
		if not c.enabled_default_img then
			lua_log(img_original_uri..' is not exist!')
			ngx.exit(404)
		else
			img_exist=io.open(ngx_img_root ..  c.default_img_uri)
			lua_log('img_exist='..img_exist,ngx.ERR)
			if img_exist then
				lua_log(img_original_uri .. ' is not exist! crop image with default image')
				img_original_uri = c.default_img_uri
			else
				lua_log(img_original_uri..' is not exist!')
				ngx.exit(404)
			end
		end
	end
	
    local img_original_path  = ngx_img_root .. img_original_uri
    local img_thumbnail_path = ngx_thumbnail_root .. uri
    local gm_command         = generate_gm_command(img_crop_type,img_original_path,img_size,img_thumbnail_path)
	
    if (gm_command) then
		lua_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)
    end
    ngx.req.set_uri('/thumbnail'..uri)
end


分享到:
评论

相关推荐

    跟我学Nginx+Lua开发_nginxlua原理_nginx_

    在Nginx中,Lua主要用于处理动态内容生成、数据处理、路由控制等任务,以增强Nginx的服务能力。 四、Nginx+Lua集成 ngx_lua 模块是Nginx与Lua交互的核心。通过该模块,可以在Nginx配置文件中直接插入Lua代码,实现...

    nginx lua插件对skywalking支持用户手册(1).docx

    - **自定义扩展**:使用 Lua 脚本扩展追踪功能,例如添加额外的日志或处理逻辑。 - **性能监控**:插件可以收集 CPU、内存等资源使用情况,与 SkyWalking 的监控指标集成。 总结,Nginx Lua 插件配合 SkyWalking ...

    nginx lua示例代码

    当Nginx与Lua结合,通过OpenResty这个平台,可以实现动态处理请求、复杂逻辑控制等功能,极大地扩展了Nginx的能力。 OpenResty是Nginx的一个发行版,集成了LuaJIT(一个高效的Lua虚拟机)和大量实用库,使得开发者...

    Nginx+lua通过url传参的方式实现动态代理

    ### Nginx+Lua通过URL传参方式实现动态代理 #### 概述 在现代Web应用开发中,灵活地管理后端服务之间的通信是至关重要的。动态代理技术为这一需求提供了解决方案,使得前端可以方便地根据业务逻辑将请求转发至不同...

    tests.lua nginx +lua 实现 访问远程地址 下载文件

    nginx +lua 实现 访问远程地址 下载文件 环境配置: 启动tomcat 把要下载的文件放到跟目录比如:pdf zip 等 启动nginx 访问nginx lua 打开socket 访问tomcat 文件路径,并下载到本地

    Nginx+upload+lua实现简单文件上传服务

    创建一个处理文件上传的lua脚本,例如`upload_handler.lua`,这个脚本会接收Nginx传递的文件信息,并进行处理,如保存文件、验证文件大小和类型等。示例脚本可能如下: ```lua local function save_file(file) ...

    nginx实战-基于lua语言

    1. **Nginx模块 ngx_lua**:Nginx与Lua的桥梁是ngx_lua模块,由OpenResty公司开发,它允许我们在Nginx配置文件中直接嵌入Lua脚本,实现动态处理请求。 2. **性能优势**:由于LuaJIT(Just-In-Time编译器)的存在,...

    nginx+lua+redis 集群 连接插件和脚本

    例如,一个典型的流程可能是:客户端发送请求到Nginx,Nginx通过lua-redis-pconnector插件将请求转发到Redis集群,Redis处理请求并返回结果,Nginx再将结果回传给客户端。同时,Lua脚本可以用来处理登录验证,通过...

    nginx lua.zip

    Nginx Lua模块是Nginx服务器的一个强大扩展,它允许我们在Nginx配置文件中直接嵌入Lua脚本,实现更灵活、高性能的Web应用处理。这个"nginx lua.zip"压缩包可能包含了一份关于如何使用Nginx与Lua结合的演示或教程,...

    nginx+lua+redis通过匹配客户端ip进行灰度发布

    lua-nginx-module 是一个 Lua 模块,提供了对 nginx 的支持,允许开发者使用 Lua 脚本来处理 HTTP 请求。 然后,需要将 lua-nginx-module 模块编译到 nginx 中。在编译时,需要指定 lua-nginx-module 的路径,以便 ...

    nginx+lua+docker+docker-compose实现简单服务分发

    nginx+lua+docker+docker-compose实现简单服务分发

    nginx+lua+redis实现token验证

    在`nginx`中,我们可以使用`lua`模块来处理这些逻辑。`lua`脚本可以直接嵌入到`nginx`配置中,允许我们在不重启服务器的情况下动态执行代码。例如,我们可以编写一个`lua`脚本来从请求头中提取`token`,然后使用`...

    Nginx+Lua阿⾥实战经验谈.pdf

    《Nginx+Lua阿里巴巴实战经验谈》 Nginx+Lua在阿里巴巴的实践中扮演了重要角色,尤其在阿里巴巴云CDN事业部的应用中,这一组合展现出了强大的效能和灵活性。Nginx+Lua的起源可以追溯到淘宝时期,由创始人王晓哲和章...

    ngx_lua_php_queue, nginx lua php redis实现单业务排队系统架构.zip

    Nginx的lua模块允许在Nginx配置中直接运行lua脚本,提供了强大的动态处理能力。通过lua,我们可以直接在Nginx层面处理部分业务逻辑,减轻后端服务器的压力。 2. **PHP**: PHP是一种广泛使用的开源脚本语言,尤其...

    Nginx+Lua+Redis+Json

    Nginx 作为 Web 服务器,可以处理高并发的请求,并提供了丰富的模块,例如 Lua 模块,可以使用 Lua 语言编写脚本来处理业务逻辑。Redis 作为内存数据库,可以高速存储和读取数据,实现高效的数据交换。 Json 作为...

    基于lua的nginx自定义负载均衡

    基于lua的nginx自定义负载均衡基于lua的nginx自定义负载均衡

    跟我学Nginx+Lua开发

    我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程 序...

    nginx-lua-GraphicsMagick

    **GraphicsMagick** 是一个强大的图像处理库,它支持多种图像格式,并且提供了丰富的API供开发者使用。在服务器上安装GraphicsMagick,可以实现快速的图片转换、裁剪和尺寸调整等功能。首先,确保你的服务器操作系统...

    idea openrestry+nginx+lua搭建企业级开发环境

    Nginx + Lua" 的组合提供了一种强大的解决方案,它允许开发者利用 IntelliJ IDEA(Idea)作为集成开发环境,OpenResty(一个扩展了 Nginx 的版本)作为服务器平台,以及 Lua 语言进行高性能的脚本处理。这种架构融合...

Global site tag (gtag.js) - Google Analytics