第三方库与lua一起工作,而不是mod_lua



我读了这篇文章,

  1. 没有可行的解决方案
  2. 我运行的不是Windows而是Linux
  3. 这是一个自制的编译
  4. 运行httpd-2.4.9

所以这是我到目前为止尝试的,但没有成功:

  • 遵循这个建议"我在哪里放置第三方lua模块"?
  • 试图在我的vhost conf中添加Lua的所有可能的PATH:

    LuaPackageCPath /web/htdocs/olivier/doonoo/2/
    LuaPackagePath /web/htdocs/olivier/doonoo/2/
    LuaPackageCPath /web/htdocs/olivier/doonoo/2
    LuaPackagePath /web/htdocs/olivier/doonoo/2
    LuaPackageCPath /web/htdocs/olivier/doonoo/2/?.so
    LuaPackagePath /web/htdocs/olivier/doonoo/2/?.so
    LuaPackageCPath /web/htdocs/olivier/doonoo/2/?
    LuaPackagePath /web/htdocs/olivier/doonoo/2/?
    LuaPackageCPath /web/htdocs/olivier/doonoo/2/
    LuaPackagePath /web/htdocs/olivier/doonoo/2/
    LuaPackageCPath ./?.so
    LuaPackagePath ./?.so
    LuaPackageCPath ./
    LuaPackagePath ./
    LuaPackageCPath ./?
    LuaPackagePath ./?
    
  • 试图把lfs.so放在我的http文件夹:/local/install/httpd-2.4.9/modules/lua

  • 试图将lfs.so放入我的lua共享/usr/local/share/lua/5.2
  • 试图将lfs.so放入更通用的共享/usr/local/share
  • 试图将lfs.so放入共享http模块/opt/httpd-2.4.9/modules/

现在我还没有找到一个有效的解决方案。任何想法?顺便说一下,我可以使用r:notice()来写一些信息,所以有一种方法来转储path和/或cpath, lua正在使用?

在我的文件中,当我在文件aa.luabb.lua中有指令require "bb"aa.lua处于相同的路径时,它可以工作。如果我尝试做export LUA_PATH=并重新启动我的web服务器,指令require "bb"aa.lua中不再工作。这意味着环境变量LUA_PATHLUA_CPATH对Apache的mod_lua有一定的影响。

现在我尝试了别的东西:动态库。我这样做:

# lua
Lua 5.2.1  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> a,b = package.loadlib('/usr/local/lib/posix_c.so', 'fcntl')
> print (a,b)
function: 0x7fbda3f845b0        nil
>

这意味着它尝试成功打开并获得fcntl函数来自posix_c.so

现在,如果我尝试将这段代码添加到mod_lua的lua文件中,像这样:

function handle(r)
    r.headers_out['Cache-Control'] = 'no-cache, must-revalidate'
    r.headers_out['Expires'] = 'Mon, 26 Jul 1997 05:00:00 GMT'
    r.content_type = 'application/json';
    local a,b = package.loadlib('/usr/local/lib/posix_c.so', 'fcntl');
    r:puts(tostring(a)..','..tostring(b))
    return apache2.OK
end

我得到了这样的输出:

nil,/usr/local/lib/posix_c.so: undefined symbol: luaL_setfuncs

看完这篇文章,我猜出了什么问题:我安装了5.2.1版本,mod_lua是用5.1编译的。因此,我删除了5.2.1和所有5.2链接,并重新编译了luaposix库。现在网页显示:function: 0x220bce0,nil,这意味着它成功打开了库。

知道是怎么回事吗?

我成功了!

有两件事阻塞了,如果他们有同样的问题,我希望能帮助其他人:

    版本号错误。mod_lua为5.1版本,lua为5.2版本。解决方案:删除5.2并安装5.1,然后重新编译所有需要的模块
  1. *.so位置。这个命令帮助我解决了这个问题:r:puts(tostring(package.cpath) .. ',n')。它显示了lua查找动态库的路径。没有一个和我的lfs.soposix_c.soposix.lua匹配。因此,我创建了文件夹/usr/local/lib/lua/5.1/(这对我来说是非常"干净"的名称和位置),并将这些文件复制到那里。

现在一切正常

最新更新