【问题标题】:OpenResty: Is it possible to create a ngx.shared.DICT in Lua without using a directive?OpenResty:是否可以在不使用指令的情况下在 Lua 中创建 ngx.shared.DICT?
【发布时间】:2020-02-24 16:26:39
【问题描述】:

我目前正在为现有的OpenResty 应用程序编写一些测试。它使用一些共享字典,这些字典是通过 lua_shared_dict 指令在 nginx.conf 文件中创建的。

我可以为它编写自己的模拟实现,但我想知道是否可以以编程方式创建 ngx.shared.DICT 对象?

是否可以在 Lua 中创建它,还是自己创建一个模拟实现更好?


背景:我当前的测试设置非常简单。我使用busted 作为测试框架并使用resty 二进制文件从命令行运行它。想法来自this article

【问题讨论】:

    标签: nginx lua openresty


    【解决方案1】:

    我没有找到创建共享字典的编程方式,所以我最终嘲笑它:

    ngx.shared.someDict = {}
    ngx.shared.someDict.get = function(self, key)
      return ngx.shared.someDict[key]
    end
    ngx.shared.someDict.set = function(self, key, val)
      ngx.shared.someDict[key] = val
    end
    

    【讨论】:

    • 这会保留其他共享的 dict 行为吗?重新加载后是否一致?它是否与其他 nginx 工作人员共享?你测试过这个吗?
    • @Mercury 正如问题中所写,我在单元测试中使用了该模拟设置。因此,它不打算在具有多个工人的生产环境中使用。在单元测试的上下文中,这对我的用例来说已经足够了。
    【解决方案2】:

    ngx.shared.DICT 是 ngx_shm_zone_t 被 nginx 用来在进程之间共享内存。 nginx guide ,配置解析时分配的共享内存,因此可能无法在 lua 代码中初始化。特别是,ngx.shared.DICT 用于在进程之间共享内存。当worker初始化后,不能通过mmap调用分配与父进程共享的内存。

    【讨论】:

      猜你喜欢
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多