ngx.var与ngx.ctx的区别

严成礼
2023-12-01

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 往往是更好的选择

作者:tokers
链接:https://www.zhihu.com/question/43196128/answer/173513231
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 类似资料: