ngx lua模块之ngx.location.capture子请求学习

简介:
nginx.conf配置
lua_code_cache off;
client_body_buffer_size 32K;
client_max_body_size 32K;

location = /public_api {
            internal;
            content_by_lua_file lualib/lua001/common.lua;
        }

location = /app01 {
            content_by_lua_file lualib/lua001/app01.lua;
        }
案例1.ngx.location.capture的参数之args和body及method

**
method 指定子请求的请求方法, 只接受类似 ngx.HTTP_POST 的常量。
body 指定子请求的请求体 (仅接受字符串值)。
args 指定子请求的 URI 请求参数 (可以是字符串或者 Lua 表)。
**

lualib/lua001/app01.lua
--学习body&args
--ngx.location.capture 返回res.status res.body res.header res.truncated
res = ngx.location.capture("/public_api",{method=ngx.HTTP_GET,body="name=zzj&age=33&name=badboy",args={arg_a=5,arg_b=4}})
for key,val in pairs(res) do
    if type(val) == "table" then
        ngx.say(key,"=>",table.concat(val,","))
    else
        ngx.say(key,"=>",val)
    end
end

lualib/lua001/common.lua
-- 获取get传递的值
local args = ngx.req.get_uri_args()
for key,val in pairs(args) do
    if type(val) == "table" then
        ngx.say(key,":",table.concat(val,","))
    end
    ngx.say(key,":",val)
end

--获取post传递的值
ngx.req.read_body()
local args, err = ngx.req.get_post_args()
if not args then
 ngx.say("failed to get post args: ", err)
 return
end
for key, val in pairs(args) do
 if type(val) == "table" then
     ngx.say(key, ": ", table.concat(val, ", "))
 else
     ngx.say(key, ": ", val)
 end
end

访问结果:
[root@tengine_lua ~]# curl http://192.167.14.56:8080/app01
status=>200
body=>arg_b:4
arg_a:5
age: 33
name: zzj, badboy

header=>
truncated=>false

案例2.ngx.location.capture的参数之vars

**
vars 用一个 Lua 表设置子请求中的 Nginx 变量值。
**

向子请求中传递nginx变量,需要在nginx.conf提前设置好变量
location = /app01 {
            set $name "";
            set $age "";
            content_by_lua_file lualib/lua001/app01.lua;
        }
或者使用ngx.var.name="zzj" ngx.var.age=34
lualib/lua001/app01.lua
--学习vars
--ngx.var.name="badboy"
--ngx.var.age=34
local res = ngx.location.capture("/public_api",{vars={name="zzj",age=32}})
--local res = ngx.location.capture("/public_api",{vars={name=ngx.var.name,age=ngx.var.age}})
for key,val in pairs(res) do
    if type(val) == 'table' then
        ngx.say(key,"=>",table.concat(val,","))
    else
        ngx.say(key,"=>",val)    
    end
end

lualib/lua001/common.lua
--测试vars
ngx.say("name:",ngx.var.name)
ngx.say("age:",ngx.var.age)

测试结果:
[root@tengine_lua ~]# curl http://192.167.14.56:8080/app01
status=>200
body=>name:zzj
age:32

header=>
truncated=>false

案例3.ngx.location.capture的参数之ctx

**
ctx 指定一个 Lua 表作为子请求的 ngx.ctx 表,可以是当前请求的 ngx.ctx 表。这种方式可以让父请求和子请求共享完全相同的上下文环境。
**
lualib/lua001/app01.lua
--学习ctx
ngx.say("First")
local ctx={}
--local res = ngx.location.capture("/public_api",{ctx=ctx})
local res = ngx.location.capture("/public_api",{ctx=ngx.ctx})
for key,val in pairs(res) do
    if type(val) == "table" then
        ngx.say(key,":",table.concat(val,","))
    else
        ngx.say(key,":",val)
    end
end

ngx.say("second")
for key,val in pairs(ctx) do
    if type(val) == "table" then
        ngx.say(key,":",table.concat(val,","))
    else
        ngx.say(key,":",val)
    end
end

ngx.say("third")
for key,val in pairs(ngx.ctx) do
    if type(val) == "table" then
        ngx.say(key,":",table.concat(val,","))
    else
        ngx.say(key,":",val)
    end
end

lualib/lua001/common.lua
--测试ctx
ngx.ctx.foo="Sub foo"
ngx.say("ctx study")

测试结果:
[root@tengine_lua ~]# curl http://192.167.14.56:8080/app01
First
status:200
body:ctx study

header:
truncated:false
second
third
foo:Sub foo

案例4.ngx.location.capture的参数之share_all_vars

**
copy_all_vars 设置是否复制所有当前请求的 Nginx 变量值到子请求中,修改子请求的 nginx 变量值不影响当前 (父) 请求
**
lualib/lua001/app01.lua
--学习copy_all_vars
ngx.var.name="zzj"
local res = ngx.location.capture("/public_api",{copy_all_vars=true})
for key,val in pairs(res) do
    if type(val) == "table" then
        ngx.say(key,":",table.concat(val,","))
    else
        ngx.say(key,":",val)
    end
end

ngx.say("main request of name:"..ngx.var.name)

lualib/lua001/common.lua
--测试copy_all_vars
ngx.var.name="badboy"
ngx.say("sub request of name:"..ngx.var.name)

测试结果:
[root@tengine_lua ~]# curl http://192.167.14.56:8080/app01
status:200
body:sub request of name:badboy

header:
truncated:false

main request of name:zzj



本文转自hahazhu0634 51CTO博客,原文链接:http://blog.51cto.com/5ydycm/1900279,如需转载请自行联系原作者

相关文章
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(下)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
135 0
|
数据格式 JSON 存储
Lua模块的加载与内存释放
今天早上听说一件事情让我觉得很诡异的事情:公司线上的一款游戏,加载一份配置资源后,内存涨了几十M,然后内存再也下不来了。因为好奇,所以要来了最大的一个配置文件(4.5M,去除空格与换行后的大小),进行测试。
2143 0
|
4月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
221 0
|
4月前
|
存储 缓存 NoSQL
Redis系列学习文章分享---第十三篇(Redis多级缓存--JVM进程缓存+Lua语法)
Redis系列学习文章分享---第十三篇(Redis多级缓存--JVM进程缓存+Lua语法)
78 1
|
负载均衡 应用服务中间件 测试技术
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(上)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
429 0
|
数据采集 存储 JavaScript
Lua 语法 Table 与模块|学习笔记
快速学习 Lua 语法 Table 与模块
Lua 语法 Table 与模块|学习笔记
|
索引
Lua语言中编写模块的基本方法
Lua语言中编写模块的基本方法
172 0
|
缓存 NoSQL 应用服务中间件
nginx安装配置Lua模块的支持
nginx安装配置Lua模块的支持
|
算法 应用服务中间件 nginx
接入层限流之OpenResty提供的Lua限流模块lua-resty-limit-traffic
使用OpenResty提供的Lua限流模块lua-resty-limit-traffic来实现接入层的限流。
2761 0
接入层限流之OpenResty提供的Lua限流模块lua-resty-limit-traffic