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 =666curl 'http://test.jinbo.com?abc=def'
abc=def666

从上边的例子可以看出如何定义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 = 6ngx.ctx.foo = ngx.ctx.foo + ngx.ctx.test}content_by_lua_block {ngx.ctx.result = ngx.ctx.foongx.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
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ngx.var与ngx.ctx的区别相关推荐

  1. nginx的 ngx.var ngx.ctx ngx.req

    ngx.var 是获取 Nginx 的变量,需要经历字符串 hash.hash 表查找等过程 ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ctx ...

  2. nginx变量ngx.var

    ngx.var 是获取 Nginx 的变量,类型是字符串或nil,需要经历字符串 hash.hash 表查找等过程. ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lu ...

  3. 由一条OpenResty Error log谈谈ngx.exit与ngx.eof的区别

    事由 我们基于Vanilla开发了一个类似于一个网关的流量分发服务,在原来的业务线上对不同的业务使用不同的后端(PHP.Python.Lua...)进行处理,最近在紧锣密鼓的测试(当然这里咱们主要看问 ...

  4. JavaScript重难点解析1(数据类型——var、let、const区别,类型补充,“===”、“typeof”、“instanceof”区别,Symbol数据类型)

    JavaScript重难点解析1(数据类型) var.let.const区别: 类型补充 "==="."typeof"."instanceof&quo ...

  5. java 全局变量_Javascript中的局部变量、全局变量的详解与var、let的使用区别

    前言 Javascript中的变量定义方式有以下三种方式: 1.直接定义变量,var与let均不写: a = 10; 2.使用var关键字定义变量 var a = 10; 3.使用let关键字定义变量 ...

  6. javasript中var、let和const区别

    let和const都是es5,es6新版本的js语言规范出来的定义,在这以前定义一个变量只能用var.let和const都是为了弥补var的一些缺陷而新设计出来的. 简单来说是: let是修复了var ...

  7. var、let 及 const 区别

    var console.log(a) // undefinedvar a = 1 从上述代码中我们可以发现,虽然变量还没有被声明,但是我们却可以使用这个未被声明的变量,这种情况就叫做提升,并且提升的是 ...

  8. JavaScript 中 var 、let、const区别

    问题 var . let. const 都可以用来声明变量,那么它们的区别是什么? 思考思路 变量的数据类型(数字,字符串,数组 and so on) 变量的作用域 ( 全局 or 局部 or 某个代 ...

  9. ngx.print与ngx.say

    --输出响应内容体:(内容体结束后没有换行符:) ngx.print("aaaaaaaaaaaaaa")--输出响应内容体:(内容体结束后,输出一个换行符:) ngx.say(&q ...

最新文章

  1. Android开发之自定义Dialog二次打开报错问题解决
  2. 給曾經的三年,寫點什么吧。-紀念華軟
  3. linux下dump命令,Linux dump命令
  4. 所选驱动器不再有效,继续安装之前,请先检查安装路径的设置
  5. java nio集群_java – Hazelcast:连接到远程集群
  6. Google File System 学习笔记
  7. java 0xf0_java 中类似js encodeURIComponent 函数的实现案例
  8. Hbase问题汇总与解答
  9. CMD中文显示为乱码
  10. php 实用 函数,PHP实用函数9
  11. error: ‘avcodec_alloc_frame’ was not declared in this scope
  12. ArcGIS+Google Earth Pro 经纬度标点地图
  13. 怎么停止skywalking_SkyWalking 告警设置
  14. SAP系统配置SMPT邮箱
  15. Spire.Doc利用word样式读取word文字内容(.NET)
  16. 自媒体平台有哪些---(特点及优缺点)
  17. js调用(前/后)摄像头,截取照片,关闭摄像头
  18. 香港主要房产公司计划寻求监管机构对代币化房地产的许可
  19. is running 8724480B beyond the ‘PHYSICAL‘ memory limit.
  20. Hyperledger Fabric 1.0 快速搭建 -------- 多机部署 Fabric CA节点服务

热门文章

  1. 推荐11个值得关注的网络安全公众号(年度精选)
  2. Dev-c++怎么设置背景色
  3. Markdown 数学公式总结
  4. GPS是如何定位的?
  5. 信贷决策问题 —— 基于国赛-19C的数据挖掘练习
  6. 计算机的c盘是硬盘吗,笔记本固态硬盘是c盘吗_笔记本电脑SSD固态硬盘就是C盘吗-win7之家...
  7. pytorch Vgg网络模型
  8. 简单的neo4j三元组增量插入-通过py2neo实现
  9. 10个BS后台UI框架
  10. K8S pod 时区设置