在 OpenResty 的体系中,可以通过共享内存的方式完成不同工作进程的数据共享,可以通过
Lua 模块方式完成单个进程内不同请求的数据共享。如何完成单个请求内不同阶段的数据共
享呢?最典型的例子,估计就是在 log 阶段记录一些请求的特殊变量。
ngx.ctx 表就是为了解决这类问题而设计的。参考下面例子:
location /test {
rewrite_by_lua_block {
ngx.ctx.foo = 76
}
access_by_lua_block {
ngx.ctx.foo = ngx.ctx.foo + 3
}
content_by_lua_block {
ngx.say(ngx.ctx.foo)
}
}
首先 ngx.ctx 是一个表,所以我们可以对他添加、修改。它用来存储基于请求的 Lua 环境数
据,其生存周期与当前请求相同 (类似 Nginx 变量)。它有一个最重要的特性:单个请求内的
rewrite (重写),access (访问),和 content (内容) 等各处理阶段是保持一致的。
额外注意,每个请求,包括子请求,都有一份自己的 ngx.ctx 表。例如:
location /sub {
content_by_lua_block {
ngx.say("sub pre: ", ngx.ctx.blah)
ngx.ctx.blah = 32
ngx.say("sub post: ", ngx.ctx.blah)
}
}
location /main {
content_by_lua_block {
ngx.ctx.blah = 73
ngx.say("main pre: ", ngx.ctx.blah)
local res = ngx.location.capture("/sub")
ngx.print(res.body)
ngx.say("main post: ", ngx.ctx.blah)
}
}
访问 GET /main 输出
218不同阶段共享变量
main pre: 73
sub pre: nil
sub post: 32
main post: 73
任意数据值,包括 Lua 闭包与嵌套表,都可以被插入这个“魔法”表,也允许注册自定义元方
法。
也可以将 ngx.ctx 覆盖为一个新 Lua 表,例如,
ngx.ctx = { foo = 32, bar = 54 }
ngx.ctx
表查询需要相对昂贵的元方法调用,这比通过用户自己的函数参数直接传递基于请
求的数据要慢得多。所以不要为了节约用户函数参数而滥用此 API,因为它可能对性能有明显
影响。
由于 ngx.ctx 保存的是指定请求资源,所以这个变量是不能直接共享给其他请求使用的。

openresty ngx.ctx表相关推荐

  1. ngx.var与ngx.ctx的区别

    ngx.var ngx.var 需预定义方可使用, 一般都写在 ngx 或 openresty 的conf 内 ngx.var: 在conf内可以使用set 方式创建变量: ngx.var 可以定义在 ...

  2. nginx的 ngx.var ngx.ctx ngx.req

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

  3. OpenResty ngx.say返回数据中文乱码解决方案

    在conf的location配置中设置 default_type text/html; charset gbk; 修改lua脚本编码格式为 gb2312 即可正常

  4. openresty开发系列24--openresty中lua的引入及使用

    openresty开发系列24--openresty中lua的引入及使用 openresty 引入 lua 一)openresty中nginx引入lua方式 1)xxx_by_lua   ---> ...

  5. openresty总结

    协程 1.例如当获取的数据没有前后依赖关系时,可以使用ngx.thread.spawn和ngx.thread.wait同时从数据库不同的库.表或者不同来源(mysql,redis等)获取数据. htt ...

  6. openresty出现socket read/write busy的原因及解决方法

    openresty出现socket read/write busy的原因及解决方法 基本概念 cosocket cosocket即openresty将其协程(coroutine)与网络套接字结合在一起 ...

  7. Nginx模块Lua-Nginx-Module学习笔记(二)Lua指令详解(Directives)

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis Nginx与Lua编写脚本的基本构建块是指令. 指令用于指定何时运行用户Lua代码以及如何使用结果. 下 ...

  8. 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...

  9. OpenResty中的upstream healthcheck功能沉思录

    综述 healthcheck功能本质上还是个定时器,去定期检查指定upstream组的状态,它发送指定的http请求并解析响应码,去探测upstream中每个peer的存活状态,再结合历史请求记录来判 ...

最新文章

  1. 通过IP地址和子网掩码与运算计算相关地址
  2. 为什么不建议用try catch处理异常?
  3. linux下截屏工具
  4. java虚拟机6.HotSpot的GC实现
  5. php nginx实现负载均衡,使用Nginx简单实现负载均衡
  6. php7.0支持调用lua脚本
  7. python 中爬虫的运用
  8. 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
  9. 设计模式11---组合模式(Composite Pattern)
  10. centos/linux 安装node.js
  11. 20个JS 小技巧超级实用
  12. sscanf一小用法
  13. python制作系统监控_用python做一个系统监控程序
  14. 122. PHP 性能问题(3)
  15. 请教Parser Generator 开发工具中关于Lex和Yacc的问题
  16. 使用Docker镜像部署Coupons淘宝客项目
  17. CentOS 开启端口
  18. OCCT示例学习笔记3--Modeling项目
  19. TypeScript 学习笔记
  20. 基于贪婪的高效Lidar-SLAM特征选择(ICRA2021)

热门文章

  1. 核心概念——节点/边/Combo——内置Combo——内置Combo总览
  2. 解决cmd中文输入法看不到待选文字
  3. 主题: 逆向英语学习方法
  4. vagrant给vmbox创建虚拟机及docker安装mysql和redis
  5. 解决vmbox虚拟机 能上网,能ping通宿机,但是宿机 ping 不通 虚拟机
  6. SpringBoot自定义注解@Idempotent实现API幂等性(防止接口重复请求)
  7. tf.Keras.Model类总结
  8. cf为什么一直连接服务器失败,为什么cf连接服务器失败的解决方法
  9. 选择GoDaddy域名的好处有哪些?
  10. [算法题]返回数组A的元素组成的小于n的最大数