nginxluaopenrestyluajit

Unable to use libraries from OPM (OpenResty)


I'm new to OpenResty, and I was trying to use the lua-resty-radixtree library, and I am running into an error:

Hello User!
ERROR: /usr/local/openresty/site/lualib/resty/radixtree.lua:102: /usr/local/openresty/site/lualib/librestyradixtree.so
/usr/local/openresty/lualib/librestyradixtree.so
./librestyradixtree.so
/usr/local/lib/lua/5.1/librestyradixtree.so
/usr/local/openresty/luajit/lib/lua/5.1/librestyradixtree.so
/usr/local/lib/lua/5.1/librestyradixtree.so
tried above paths but can not load librestyradixtree.so
stack traceback:
        /usr/local/openresty/site/lualib/resty/radixtree.lua:102: in main chunk
        [C]: in function 'require'
        lua/hello.lua:3: in function 'file_gen'
        init_worker_by_lua:45: in function <init_worker_by_lua:43>
        [C]: in function 'xpcall'
        init_worker_by_lua:52: in function <init_worker_by_lua:50>

Here is the Lua code:

ngx.say("Hello User!")

local radix = require("resty.radixtree")
        local rx = radix.new({
            {
                paths = {"/aa", "/bb*", "/name/:name/*other"},
                hosts = {"*.bar.com", "foo.com"},
                methods = {"GET", "POST", "PUT"},
                remote_addrs = {"127.0.0.1","192.168.0.0/16",
                                "::1", "fe80::/32"},
                vars = {
                    {"arg_name", "==", "json"},
                    {"arg_weight", ">", 10},
                },
                filter_fun = function(vars, opts)
                    return vars["arg_name"] == "json"
                end,

                metadata = "metadata /bb",
            }
        })

        -- try to match
        local opts = {
            host = "foo.com",
            method = "GET",
            remote_addr = "127.0.0.1",
            vars = ngx.var,
        }
        ngx.say(rx:match("/aa", opts))

        -- try to match and store the cached value
        local opts = {
            host = "foo.com",
            method = "GET",
            remote_addr = "127.0.0.1",
            vars = ngx.var,
            matched = {}
        }
        ngx.say(rx:match("/name/json/foo/bar/gloo", opts))
        ngx.say("name: ", opts.matched.name, " other: ", opts.matched.other)

And the Nginx configuration:

pid logs/nginx.pid;
events {
  worker_connections 1024;
}

http {
  server {
    listen 8080;
    location / {
      content_by_lua_file lua/hello.lua;
      }
    }
  }

I had installed the libraries through OPM by running:

sudo opm get xiangnanscu/lua-resty-radixtree
sudo opm get xiangnanscu/lua-resty-expr
sudo opm get xiangnanscu/lua-resty-ipmatcher

Looking into the issue, I found that OpenResty is under this path /usr/bin/openresty while the Lua library is searching for the .so file in the /usr/local/openresty folder as shown in the error.

I tried setting this in the nginx.conf file but it did not change anything:

lua_package_path "$prefix/resty_modules/lualib/?.lua;;";
lua_package_cpath "$prefix/resty_modules/lualib/?.so;;";

Any idea what the issue is and how to fix it? Thanks in advance!


Solution

  • The xiangnanscu/lua-resty-radixtree package you are trying to use is not official (it's originated from this fork) and does not indeed contain the librestyradixtree.so.

    Moreover, opm does not support native shared libraries (.so/.dll/.dylib) whatsoever:

    opm currently only supports pure Lua libraries

    Check the documentation.

    You should probably follow the official installation instructions — https://github.com/api7/lua-resty-radixtree#install


    FWIW: the error you've got is raised here.