在运行时,来自Lua的MySql存在未定义的符号问题

在运行时,来自Lua的MySql存在未定义的符号问题,mysql,nginx,lua,sinatra,Mysql,Nginx,Lua,Sinatra,我有一个LuaWeb服务,它需要使用MySql。如果我尝试从lua控制台访问MySql,我会获得成功,如您所见: $lua Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio > local luasql = require('luasql.mysql') > local json = require('json') > mysql = assert(luasql.mysql()) > ret = {} > db_

我有一个LuaWeb服务,它需要使用MySql。如果我尝试从lua控制台访问MySql,我会获得成功,如您所见:

$lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> local luasql = require('luasql.mysql')
> local json = require('json')
> mysql = assert(luasql.mysql())
> ret = {}
> db_name = "luaTest"
> db_host = "localhost"
> db_user = "root"
> db_pass = ""
> con = assert(mysql:connect(db_name, db_user, db_pass, db_host))
> cur = assert(con:execute("SELECT version()"))
> ret["driver_version"] = luasql._MYSQLVERSION
> ret["copyright"] = luasql._COPYRIGHT
> ret["description"] = luasql._DESCRIPTION
> ret["version"] = luasql._VERSION
> con:close()
> mysql:close()
> print(json.encode(ret))
{"copyright":"Copyright (C) 2003-2008 Kepler Project","version":"LuaSQL 2.1.2","driver_version":"5.5.29-MariaDB","description":"LuaSQL is a simple interface from Lua to a DBMS"}
我的服务器上有该代码(文件:/etc/nginx/www/ademar/app.lua):

如果我尝试使用
$curl-X POST运行它http://127.0.0.1/signin
我得到一个html错误,在服务器日志中我得到它:

2014/01/11 17:32:20 [error] 5104#0: *2 lua entry thread aborted: runtime error: error loading module 'luasql.mysql' from file '/usr/lib/lua/5.1/luasql/mysql.so':
    /usr/lib/lua/5.1/luasql/mysql.so: undefined symbol: luaL_openlib
stack traceback:
coroutine 0:
    [C]: ?
    [C]: in function 'require'
    /etc/nginx/www/ademar/app.lua:3: in function </etc/nginx/www/ademar/app.lua:1>, client: 127.0.0.1, server: adem.ar, request: "POST /signin HTTP/1.1", host: "127.0.0.1"
以及:


编辑 lua控制台中的一些变量:

package.path = ./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib/lua/5.1/‌​?.lua;/usr/lib/lua/5.1/?/init.lua
package.cpath = ./?.so;/usr/lib/lua/5.1/?.so;/usr/lib/lua/5.1/loadall.so.
LD_LIBRARY_PATH = nil
从nginx脚本:

package.path = ./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib/lua/5.1/‌​?.lua;/usr/lib/lua/5.1/?/init.lua;/usr/local/openresty/nginx/lualib/?.lua;/usr/lo‌​cal/openresty/nginx/lualib/?/init.lua;./?.lua;/usr/local/share/lua/5.1/?.lua;/usr‌​/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5‌​.1/?/init.lua;
package.cpath = ./?.so;/usr/lib/lua/5.1/?.so;/usr/lib/lua/5.1/loadall.so;/usr/local/openresty/ng‌​inx/lualib/?.so;./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall‌​.so;
LD_LIBRARY_PATH = nil

luaL_openlib是Lua5.0中的函数,但不是5.1中的函数。在5.1中,它被luaL_寄存器取代。因此,您安装的luasql很可能是针对lua5.0的,而您的系统上安装了(我假定,根据您的包路径)lua5.1

如果您根本没有安装5.0(也不是nginx下的某个地方),可能是路径差异?如果mysql.so链接到另一个.so或需要一个Lua模块(谁知道mysql做什么,它可能会调用Lua的require),但在两种环境中看到的路径不同,它可能会找到错误的库:该库可能使用5.0 luaL_openlib。或者,不同的环境(例如用户权限)使mysql的行为不同,例如寻找不同的库。从脚本中打印
package.path
package.cpath
os.getenv(“LD\u LIBRARY\u path”)


好的,我检查了github上luasql/mysql模块的源代码。版本2.2.x(6年前发布)和更高版本使用旧的luaL_openlib(必须是Lua 5.0版本),尽管提交日志表明5.1有一个兼容文件。可能您的mysql.so版本是为5.0构建的。版本2.3使用Lua5.2中的luaL_setfuncs,因此可能还需要使用一个构建设置来告诉编译器使用5.1头并链接到5.1。

感谢提供信息,我用新闻编辑了问题并删除了注释:)LD_LIBRARY_路径应该存在。你用什么命令得到它,是os.getenv(“LD_LIBRARY_PATH”)?@scholli正是这个命令,控制台的副本:>=os.getenv(“LD_LIBRARY_PATH”)告诉你使用Lua还是Luajit?@scholli问得好,因为我已经安装了这两个。在我的命令行测试中,我使用的是lua而不是luajit,在nginx上,遵循这个线程,因为我真的不知道我也在使用lua,而不是luajit。
$cat sites-enabled/xicoh.conf 
lua_package_path './?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib/lua/5.1/?.lua;/usr/lib/lua/5.1/?/init.lua;;';
lua_package_cpath './?.so;/usr/lib/lua/5.1/?.so;/usr/lib/lua/5.1/loadall.so;;';

server {
  listen      80;
  server_name adem.ar;
  charset     utf-8;
  root        /etc/nginx/www/ademar;

  location / {
    default_type 'text/plain';
    content_by_lua_file "/etc/nginx/www/ademar/app.lua";
  }

  error_page 500 502 503 504 /50x.html;
  location = /50x.html { root html; }
}
package.path = ./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib/lua/5.1/‌​?.lua;/usr/lib/lua/5.1/?/init.lua
package.cpath = ./?.so;/usr/lib/lua/5.1/?.so;/usr/lib/lua/5.1/loadall.so.
LD_LIBRARY_PATH = nil
package.path = ./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib/lua/5.1/‌​?.lua;/usr/lib/lua/5.1/?/init.lua;/usr/local/openresty/nginx/lualib/?.lua;/usr/lo‌​cal/openresty/nginx/lualib/?/init.lua;./?.lua;/usr/local/share/lua/5.1/?.lua;/usr‌​/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5‌​.1/?/init.lua;
package.cpath = ./?.so;/usr/lib/lua/5.1/?.so;/usr/lib/lua/5.1/loadall.so;/usr/local/openresty/ng‌​inx/lualib/?.so;./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall‌​.so;
LD_LIBRARY_PATH = nil