添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

ngx.var

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

从上边的例子可以看出如何定义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'

从上边的例子看出 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
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

环境: init_worker_by_lua, set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua, ngx.timer., balancer_by_lua 这个 Lua 表可以用来存储基于请求的 Lua 环境数据,其生存周期与当前请求相同 (类似 Nginx 变量)。 参考下面例子, location /test { rewrite_by_lua_block { ngx.ctx.foo = 76 http { log_format log_req_resp '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_byte 在 OpenResty 的体系中,可以通过共享内存的方式完成不同工作进程的数据共享,可以通过 Lua 模块方式完成单个进程内不同请求的数据共享。如何完成单个请求内不同阶段的数据共 享呢?最典型的例子,估计就是在 log 阶段记录一些请求的特殊变量。 ngx.ctx 表就是为了解决这类问题而设计的。参考下面例子: location /test { rewrite_by_lua_block { ngx... ngx.var 是获取 Nginx 的变量,类型是字符串或nil,需要经历字符串 hash、hash 表查找等过程。 ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ctx_ref)。 使用 ngx.ctxngx.var 往往是更好的选择。 nginx变量使用方法详解(7):http://www.ttlsa.com/nginx/nginx-var-7/ nginx的ngx.var ngx.ctx ngx.req: https.. 内置变量存放在 ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的。总而言之,这些变量代表着客户端请求头的内容,例如$http_user_agent, $http_cookie, 等等。下面是nginx支持的一些内置变量: $arg_name 请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name $args 生命周期和请求一致 每个请求的ngx.ctx是相互独立的,包括ngx.location.capture的子请求 内部跳转(Internal redirection)如ngx.exec会销毁ngx.ctx,重建新的. ngx.ctx的属性查找代价相对昂贵,所以尽量使用显式的函数参数. syntax: ngx.var.VAR_NAME context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua* 读或者写 Nginx 变量值: ngx_core_commands : 核心指令集变量 ngx_core_module_ctx : 核心模块上下文变量ngx_core_module : 核心模块变量ngx_show_help : 无符号整型, 标记是否 一:常用功能优化: 1:网络连接的优化:   只能在events模块设置,用于防止在同一一个时刻只有一个请求的情况下,出现多个睡眠进程会被唤醒但只能有一个进程可获得请求的尴尬,如果不优化,在多进程的nginx会影响以部分性能。 events { accept_mutex on; #优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被同时唤醒,默认为off,因此... ngx.arg[1]                脚本参数 ngx.var['arg_a']            取queryString的参数a #/nginx_var?a=hello,world ngx.say(...)                依次输出参数,带换行 ngx.print(...)                格式化输出,不带换行 ngx.var.name