大家好,欢迎来到IT知识分享网。
一、Lua包的管理工具luarocks的安装使用
Lua里面的so文件在一些服务器(各环境相同)之间是可以通用的,但在有些服务器之间就是不行,这几天在迁移一个业务时就碰到这样的事情,使用nginx+lua搭建的一套接口系统,里面使用了cmsgpack扩展,但是在新的环境下unpack这个方法就是不起作用,就像黑洞一样,调用之后也没有反应,也没有报错,就是没有结果。
针对cmsgpack.so解压缩内容的异常问题,尝试了很多次也调试了很久,就是这个地方调不出问题,蛋痛地很。于是准备在另一台服务器上尝试一遍,最后将在新服务器中生成的cmsgpack.so文件放到原服务器上,然后就神奇地正常了。
说明:新用的这两台服务器硬件软件基本相当,而原来的服务器与这些差异较大。
可见:的确是需要在不同的服务器上进行编译独立的so文件才能更有效,另外今天我第一发次发lua也有一个像composer、pip、yum这样的东西,叫luarocks。真的很有用。安装了这个东西之后,需要什么扩展直接使用luarocks install lua扩展包即可。
luarocks官网:https://luarocks.org/ 每天也有几万的模块下载量,官网上的数据截图如下:
下面是安装程序的过程,期间luarocks需要使用git,所以要安装git, 另外执行configure的时候可能会报缺少lua.h,需要使用 yum install lua-devel安装一下基础lua模块。整个安装过程及报错的解决方法如下:
[onlinedev@BFG-OSER-4471 ssdb]$ cd /opt/modules/download
[onlinedev@BFG-OSER-4471 download]$ sudo wget https://luarocks.github.io/luarocks/releases/luarocks-3.0.4.tar.gz
[onlinedev@BFG-OSER-4471 download]$ sudo tar zxvf luarocks-3.0.4.tar.gz
[onlinedev@BFG-OSER-4471 download]$ cd luarocks-3.0.4
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ sudo ./configure
Configuring LuaRocks version 3.0.4...
Lua version detected: 5.1
Lua interpreter found: /usr/bin/lua
lua.h not found (tried /usr/include/lua/5.1/lua.h /usr/include/lua5.1/lua.h /usr/include/lua51/lua.h /usr/include/lua.h)
If the development files for Lua (headers and libraries)
are installed in your system, you may need to use the
--with-lua or --with-include flags to specify their location.
If those files are not yet installed, you need to install
them using the appropriate method for your operating system.
Run ./configure --help for details on flags.
configure failed.
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ locate lua.h
/usr/share/doc/lua-5.1.4/lua.html
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ sudo yum install lua-devel
Running Transaction
  Installing : lua-devel-5.1.4-4.1.el6.x86_64                                                                                            1/1 
  Verifying  : lua-devel-5.1.4-4.1.el6.x86_64                                                                                            1/1 
Installed:
  lua-devel.x86_64 0:5.1.4-4.1.el6                                                                                                           
Complete!
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ sudo updatedb             
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ locate lua.h                       
/opt/modules/download/ngx_openresty-1.9.3.1/build/LuaJIT-2.1-20150622/src/lua.h
/opt/modules/download/ngx_openresty-1.9.3.1/build/LuaJIT-2.1-20150622/src/lua.hpp
/opt/modules/download/ngx_openresty-1.9.3.1/build/lua-5.1.5/doc/lua.html
/opt/modules/download/ngx_openresty-1.9.3.1/build/lua-5.1.5/etc/lua.hpp
/opt/modules/download/ngx_openresty-1.9.3.1/build/lua-5.1.5/src/lua.h
/opt/modules/download/ngx_openresty-1.9.3.1/build/luajit-root/opt/modules/openresty/luajit/include/luajit-2.1/lua.h
/opt/modules/download/ngx_openresty-1.9.3.1/build/luajit-root/opt/modules/openresty/luajit/include/luajit-2.1/lua.hpp
/opt/modules/download/ngx_openresty-1.9.3.1/bundle/LuaJIT-2.1-20150622/src/lua.h
/opt/modules/download/ngx_openresty-1.9.3.1/bundle/LuaJIT-2.1-20150622/src/lua.hpp
/opt/modules/download/ngx_openresty-1.9.3.1/bundle/lua-5.1.5/doc/lua.html
/opt/modules/download/ngx_openresty-1.9.3.1/bundle/lua-5.1.5/etc/lua.hpp
/opt/modules/download/ngx_openresty-1.9.3.1/bundle/lua-5.1.5/src/lua.h
/opt/modules/openresty/luajit/include/luajit-2.1/lua.h
/opt/modules/openresty/luajit/include/luajit-2.1/lua.hpp
/usr/include/lua.h
/usr/include/lua.hpp
/usr/share/doc/lua-5.1.4/lua.html
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ sudo ./configure
Configuring LuaRocks version 3.0.4...
Lua version detected: 5.1
Lua interpreter found: /usr/bin/lua
lua.h found: /usr/include/lua.h
unzip found in PATH: /usr/bin
Done configuring.
LuaRocks will be installed at......: /usr/local
LuaRocks will install rocks at.....: /usr/local
LuaRocks configuration directory...: /usr/local/etc/luarocks
Using Lua from.....................: /usr
* Type make and make install:
  to install to /usr/local as usual.
* Type make bootstrap:
  to install LuaRocks into /usr/local as a rock.
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ sudo make bootstrap
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ sudo make install
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ which luarocks
/usr/local/bin/luarocks
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ sudo ln -s /usr/local/bin/luarocks /usr/bin/luarocks
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$  sudo luarocks install lua-cmsgpack
Installing https://luarocks.org/lua-cmsgpack-0.4.0-0.rockspec
Error: 'git' program not found. Make sure Git is installed and is available in your PATH (or you may want to edit the 'variables.GIT' value in file '/usr/local/etc/luarocks/config-5.1.lua')
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$ sudo yum install -y git
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$  sudo luarocks install lua-cmsgpack
Installing https://luarocks.org/lua-cmsgpack-0.4.0-0.rockspec
lua-cmsgpack 0.4.0-0 is now installed in /opt/modules/download/luarocks-3.0.4/lua_modules (license: Two-clause BSD)
[onlinedev@BFG-OSER-4471 luarocks-3.0.4]$
二、lua里遇到了烦人的报错 lua: module ‘ffi’ not found:
今天对公司的业务上的nginx+lua签名验证系统进行了改造,优化了原有的流程,在这个基础上我就想把一台服务器在原有的nginx proxy服务器的基础上进行优化,因为后期我将要对原来的几台proxy服务器进行改动,也算是提前先处理下,但是在处理的时候就碰到了问题了。当前的服务器与proxy的一个差别就是proxy上多安装了一个nginx模块:nginx_upstream_check_module。所以我需要将现在的这个服务器上的nginx扩展安装,但一看原来的解压包等各module下载后的压缩包我都没有权限(属于运维人员的),于是我就就打算下载和原来版本一样的软件进行安装:
–user=www –group=www –prefix=/opt/modules/nginx –with-http_stub_status_module –with-http_ssl_module –with-http_perl_module –with-pcre=../pcre-8.39 –with-debug –add-module=../ngx_devel_kit-0.2.18/ –add-module=../lua-nginx-module-0.9.16/ –add-module=../nginx_upstream_check_module-0.3.0/
这是原来的nginx安装时加载的模块,我也整了一个一样的重新安装了一下nginx(备注luajit原来就已经装好)。后面还有conf里的一些东西,整好之后看起来一切正常,但是当我执行lua签名的时候报错了:
2017/06/25 14:36:43 [error] 22591#0: *60 lua entry thread aborted: runtime error: ...ng-data/antifu/include_lua/resty/string.lua:4: module 'ffi' not found: no field package.preload['ffi'] no file '/opt/data/wireless_antifu/ffi.lua' no file '/opt/data/wireless_antifu/include_lua/ffi.lua' no file './ffi.lua' no file '/usr/share/lua/5.1/ffi.lua' no file '/usr/share/lua/5.1/ffi/init.lua' no file '/usr/lib64/lua/5.1/ffi.lua' no file '/usr/lib64/lua/5.1/ffi/init.lua' no file '/opt/data/wireless_antifu/include_so/ffi.so' no file './ffi.so' no file '/usr/lib64/lua/5.1/ffi.so' no file '/usr/lib64/lua/5.1/loadall.so' stack traceback: coroutine 0: [C]: in function 'require' ...ng-data/wireless_antifu/include_lua/resty/string.lua:4: in main chunk [C]: in function 'require' ...t/data/wireless_antifu/include_lua/utils.lua:1: in main chunk [C]: in function 'require'
看报错意思就是ffi模块没有找到,但我这个nginx和原来安装的没有区别啊。ffi模块是内嵌在luajit中的模块,但之前的nginx一直运行良好也未报这个错误,那为什么之前的nginx中的lua能正常运行呢?找不到答案,google也找了一些,对ffi模块也没有很多有用的文章,但有一点是知道的,找不到ffi模块说明nginx没有加载上luajit.我之前的搭过不少次nginx+luajia的。于是我不按照原来的proxy服务器环境搭建nginx.
export LUAJIT_LIB=/opt/modules/luajit/lib export LUAJIT_INC=/opt/modules/luajit/include/luajit-2.0 sudo ./configure --user=www --group=www --prefix=/opt/modules/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_perl_module --with-pcre=../pcre-8.39 --with-debug --add-module=../ngx_devel_kit-0.2.18/ --add-module=../lua-nginx-module-0.9.16/ --add-module=../nginx_upstream_check_module-0.3.0/ --with-ld-opt="-Wl,-rpath,/opt/modules/luajit/lib"
一切安装成功,但是启动nginx还是报这个错误,这就怪了。找不到问题所在,我试着换了一下luajit的版本,开始我用的是2.0.3的,改成了2.0.4的版本。但是还是不行;接着我又把nginx改成1.10算了。想看看会不会是版本的问题,当然我觉得应该不会是这个原因。心里想可能得用最后一个办法了,那就是使用openresty,我的博客中关于openresry的文章也有几篇,安装nginx+lua时总会遇到一些BUG。openresty比较可靠。于是我用openresty架起了nginx+lua环境,一运行OK。但这并不是我最想用的办法。另外它也没解释我碰到的问题。现在在另外的服务器上同样的nginx一样在跑着这些lua脚本也不会报找不到ffi模块。记个日志在这里,会不会哪天有答案。
三、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应该能解决,但上次我碰到这个问题的时候也重装过,并没有解决。上一章内容解决方法需要重装NGINX:今天的解决方法不需要重装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 (0x0000003cea) [onlinedev@OS-4475 src]$ ll /usr/lib64/ | grep lua --color -rwxr-xr-x 1 root root  Aug 19 2010 liblua-5.1.so lrwxrwxrwx 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.old sudo 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.so sudo ln -s /usr/lib64/liblua-5.1.so /usr/lib64/liblua.so
kill当前的nginx进程,再启动nginx,然后执行上面的打印lua版本的脚本,就打出了luajia2.0.4了。圆满解决!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120079.html
                