第三方库与lua一起使用,而不是与mod_lua一起使用

时间:2014-05-11 13:55:05

标签: apache lua mod-lua

我看过this和:

  1. 没有提出可行的解决方案
  2. 我不是在运行Windows而是运行Linux
  3. 这是一个自制的汇编
  4. 正在运行httpd-2.4.9
  5. 所以这是我到目前为止所尝试的,但没有成功:

    • 遵循此建议“where do I put 3rd party lua modules”?
    • 尝试在我的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 shared /usr/local/share/lua/5.2
    • 尝试将lfs.so放入更通用的共享/usr/local/share
    • 尝试将lfs.so放入共享的http模块/opt/httpd-2.4.9/modules/

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

    在我的文件中,当我在文件require "bb"中有指令aa.lua并且bb.luaaa.lua处于同一路径时,它可以正常工作。如果我尝试执行export LUA_PATH=并重新启动我的网络服务器,则指令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的{​​{1}}函数。

    现在,如果我尝试将此代码添加到posix_c.so的lua文件中,请执行以下操作:

    mod_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
    

    在阅读this之后,我猜到了什么问题:我安装了5.2.1版本,nil,/usr/local/lib/posix_c.so: undefined symbol: luaL_setfuncs 编译为5.1。所以我删除了5.2.1,所有5.2链接,并重新编译了mod_lua lib。现在网页给了我这个:luaposix这意味着它成功地打开了库。

    知道发生了什么事吗?

1 个答案:

答案 0 :(得分:2)

我做到了!

有两件事是封锁的,如果遇到同样的问题,我希望能帮助其他人:

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