文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

nginx怎么使用ctx实现数据共享

2024-04-02 19:55

关注

这篇文章主要介绍了nginx怎么使用ctx实现数据共享的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nginx怎么使用ctx实现数据共享文章都会有所收获,下面我们一起来看看吧。

环境: 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

     }

     access_by_lua_block {

         ngx.ctx.foo = ngx.ctx.foo + 3

     }

     content_by_lua_block {

         ngx.say(ngx.ctx.foo)

     }

 }

访问 GET /test 输出

79

也就是说,ngx.ctx.foo 条目跨越一个请求的 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 输出

main pre: 73

sub pre: nil

sub post: 32

main post: 73

这里,在子请求中修改 ngx.ctx.blah 条目并不影响父请求中的同名条目,因为它们各自维护不同版本的 ngx.ctx.blah。

内部重定向将摧毁原始请求中的 ngx.ctx 数据 (如果有),新请求将会有一个空白的 ngx.ctx 表。例如,

location /new {

     content_by_lua_block {

         ngx.say(ngx.ctx.foo)

     }

 }

 location /orig {

     content_by_lua_block {

         ngx.ctx.foo = "hello"

         ngx.exec("/new")

     }

 }

访问 GET /orig 将输出

nil

而不是原始的 "hello" 值。

任意数据值,包括 Lua 闭包与嵌套表,都可以被插入这个“魔法”表,也允许注册自定义元方法。

也可以将 ngx.ctx 覆盖为一个新 Lua 表,例如,

ngx.ctx = { foo = 32, bar = 54 }

当用在 init_worker_by_lua* 环境中,这个表与当前 Lua 句柄生命周期相同。

ngx.ctx 表查询需要相对昂贵的元方法调用,这比通过用户自己的函数参数直接传递基于请求的数据要慢得多。所以不要为了节约用户函数参数而滥用此 API,因为它可能对性能有明显影响。

而且由于元方法“魔法”,不要在 lua 模块级别试图使用 "local" 级别的 ngx.ctx ,例如 worker-level data sharing。下面示例是糟糕的:

-- mymodule.lua

local _M = {}

-- 下面一行的 ngx.ctx 是属于单个请求的,但 ctx 变量是在 Lua 模块级别

-- 并且属于单个 worker 的。

local ctx = ngx.ctx

 function _M.main()

     ctx.foo = "bar"

 end

 return _M

应使用下面方式替代:

-- mymodule.lua

 local _M = {}

 function _M.main(ctx)

     ctx.foo = "bar"

 end

 return _M

就是说,调用者对 ctx 表调用应通过函数传参方式完成。

关于“nginx怎么使用ctx实现数据共享”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“nginx怎么使用ctx实现数据共享”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯