ngx.var
- ngx.var 需预定义方可使用, 一般都写在 ngx 或 openresty 的conf 内 ngx.var;
- 在conf内可以使用set 方式创建变量;
- ngx.var 可以定义在location内,也可以定义在server 内;
- 在lua 代码使用时,需要 ngx.var.xxx 引用;
- ngx.var.xxx = nil 表示删除。
server { $listen 80; server_name test.jinbo.com; set $c 666; location /foo { set $a 12; set $b ''; rewrite_by_lua_block { ngx.var.b = tonumber(ngx.var.a) + 12; } content_by_lua_block { ngx.say("b = ", ngx.var.b); ngx.say("c =", ngx.var.c); } location / { echo $args; echo $a; echo $b; echo $c; } } } #结果如下: curl 'http://test.jinbo.com/foo' b = 24 c =666 curl 'http://test.jinbo.com?abc=def' abc=def 666
从上边的例子可以看出如何定义ngx.var变量;也能发现ngx.var的作用域范围:
ngx.var.c 这个变量,作用域范围为所有的location,即贯穿所有的请求;
ngx.var.a 与 ngx.var.b, 作用域范围为 “location /foo”。
ngx.ctx
需在ngx_lua 模块上下文定义使用, 变量作用域属于单个location,如下例子:
location /test_ctx { rewrite_by_lua_block { ngx.ctx.foo = 660 } access_by_lua_block { ngx.ctx.test = 6 ngx.ctx.foo = ngx.ctx.foo + ngx.ctx.test } content_by_lua_block { ngx.ctx.result = ngx.ctx.foo ngx.say(ngx.ctx.result) } } #结果如下: curl 'http://test.qunar.com/test_ctx' 666
从上边的例子看出 ngx.ctx变量在整个location lua 模块内“动态创建变量”;
也说明仅能在当前的请求内共享变量。
ngx.var 是获取 Nginx 的变量,需要经历字符串 hash、hash 表查找等过程
ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ctx_ref)
使用 ngx.ctx 比 ngx.var 往往是更好的选择
转载请注明:爱开源 » ngx.var与ngx.ctx的区别