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_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 往往是更好的选择
作者:tokers
链接:https://www.zhihu.com/question/43196128/answer/173513231
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。