ngx lua: область действия локальной переменной, init в init_by_lua_block

Я новичок в nginx lua, и получил настройки от предыдущего разработчика. Пытаясь просмотреть документы, чтобы понять сферу, но я не совсем уверен.

Это так прямо сейчас

init_by_lua_block {
    my_module = require 'my_module'
    my_module.load_data()
}


location / {
    content_by_lua_block {
        my_module.use_data()
    }
}

И в my_module

local _M = {}
local content = {}

function _M.use_data()
    -- access content variable
end

function _M.load_data()
    -- code to load json data into content variable
end

return _M

Насколько я понимаю, контент является локальной переменной, поэтому его время жизни находится в каждом запросе. Тем не менее, он инициализируется в init_by_lua_blockи используется другими локальными функциями, что меня смущает. Это хорошая практика? И каково действительное время жизни этой переменной содержимого?

Большое спасибо за чтение.

2 ответа

Нашел это: https://github.com/openresty/lua-nginx-module

Чтобы глобально обмениваться данными между всеми запросами, обрабатываемыми одним и тем же рабочим процессом nginx, инкапсулировать общие данные в модуль Lua, использовать встроенную Lua require для импорта модуля, а затем манипулировать общими данными в Lua. Это работает, потому что требуемые модули Lua загружаются только один раз, и все сопрограммы будут совместно использовать одну и ту же копию модуля (как его код, так и данные). Однако обратите внимание, что глобальные переменные Lua (обратите внимание, не переменные уровня модуля) НЕ БУДУТ сохраняться между запросами из-за схемы изоляции одного сопрограммы на запрос.

Вот полный небольшой пример:

-- mydata.lua
local _M = {}

local data = {
    dog = 3,
    cat = 4,
    pig = 5,
}

function _M.get_age(name)
    return data[name]
end

return _M

и затем доступ к нему из nginx.conf:

location /lua {
    content_by_lua_block {
        local mydata = require "mydata"
        ngx.say(mydata.get_age("dog"))
    }
}

init_by_lua[_block] выполняется на этапе nginx-loading-config, прежде чем разветвляется рабочий процесс.

Итак content переменная глобальная, она одинакова в каждом запросе.

https://github.com/openresty/lua-nginx-module/

Другие вопросы по тегам