nginx+lua环境报错lua: module ffi not found:的完美解决方法

 关于nginx+lua脚本的开发,上次写过一篇文章:lua里遇到了烦人的报错 lua: module ffi not found:的解决方法。今天又遇到了这个问题,不过今天很爽,因为今天自己找到了解决这个问题的方法。

    首先为什么报这个错,FFI库是luajit里一个非常重要也非常好用的库,ffi是一个简化的调用c库函数的途径。目的是简化lua和c语言之间调用的繁琐的push和pop。的搭建的nginx+lua环境中报这个错误说明就nginx里加载的lua并不是luajit,因为lua中没有ffi库,只有luajit中有ffi库。上次遇到这个问题,我尝试了很多方法,但是没有成功,最后我只能把nginx换成了openresty集成环境,但我实际并不希望这样解决,因为在其它的服务器里我们没有使用openresty,所以我希望能不改变nginx的情况下解决这个问题。今天终于不负有心人啊,加班到这个点把问题搞定了。

    先从nginx里看下如何查看当前你的lua到底是用的luajia还是lua,方法1:在nginx+lua中执行脚本:


if jit then        ngx.say('luajit:' .. jit.version)else        ngx.say('lua:'_VERSION)end

     如果你使用的是luajit,在执行的结果里就会显示luajit字符以及对应的版本号,不然就是显示下面的lua。如果你碰到报错,lua: module ffi not found。那说明肯定用的是标准的lua,而不是luajit。


    正常情况下,在安装nginx的时候通过,指定环境变量从而告诉nginx编译时使用的LuaJIT路径:


#告诉nginx编译时使用的LuaJIT路径:    export LUAJIT_LIB=/usr/local/lib  export LUAJIT_INC=/usr/local/include/luajit-2.0

    但也许是你漏了这两行,也许是进行过其它的变更,最后编译的nginx里的lua并不是luajit,于是导致了上面的问题。按理重装nginx应该能解决,但上次我碰到这个问题的时候也重装过,并没有解决。上次的文章在这里:http://www.04007.cn/article/394.html 。今天的解决方法不需要重装nginx.


    首先,我推测不管nginx编译时用的哪个lua,最后肯定会调用lua库,我想是不是修改nginx里调用的lua库路径,就能解决这个问题。最后看到一篇文章,里面有一句话提醒了我。里面提到可以使用ldd命令验证nginx是否使用了luajit文件。比如我服务器上的nginx安装路径,执行如下,可以发现nginx里使用的lua文件,就在/usr/lib64下面的so文件,而查找一下相同的功能的luajit文件的目录和路径。


[onlinedev@OS-4475 src]$ ldd /opt/modules/nginx/sbin/nginx | grep lua                                                liblua-5.1.so => /usr/lib64/liblua-5.1.so (0x0000003cea200000)[onlinedev@OS-4475 src]$ ll /usr/lib64/ | grep lua --color-rwxr-xr-x   1 root root   186296 Aug 19  2010 liblua-5.1.solrwxrwxrwx   1 root root       13 Apr 18 10:18 liblua.so -> liblua-5.1.so[onlinedev@OS-4475 src]$ locate libluajit-5.1.so.2/usr/local/luajit/lib/libluajit-5.1.so.2/usr/local/luajit/lib/libluajit-5.1.so.2.0.4

     于是解决方法也很容易了,将libluajit文件替换原来的lua文件,如下:



#保留一下原来的两个文件,因为当时我也不能解决,先只是换个名字sudo mv /usr/lib64/liblua-5.1.so /usr/lib64/liblua-5.1.so.oldsudo mv /usr/lib64/liblua.so /usr/lib64/liblua.so.old#然后将新的luajit文件替换原来的sudo cp /usr/local/luajit/lib/libluajit-5.1.so.2 /usr/lib64/liblua-5.1.sosudo ln -s /usr/lib64/liblua-5.1.so  /usr/lib64/liblua.so

     kill当前的nginx进程,再启动nginx,然后执行上面的打印lua版本的脚本,就打出了luajia2.0.4了。圆满解决!


Leave a Comment