如何在nginx中从lua访问套接字?

我已经通过源代码构建了支持lua的nginx,并且可以运行服务器端脚本,如下所示:

http {
  lua_package_path '/usr/local/share/lua/5.1/?.lua;;';
  server {
    listen 80;
    location /hi {
        content_by_lua '
            ngx.header["Content-Type"] = "text/plain;charset=utf-8"
            ngx.say("Hello world!")
            --local s = require("socket")
            ngx.say(_VERSION);
        ';
    }
  }
}

因此,当我访问[http://localhost/hi](http://localhost/hi)时,会得到以下输出:

Hello world!
Lua 5.1

如果我取消注释local s = require(“socket”)的行,那么我在浏览器中会得到以下错误:

无法加载页面
在加载URL http://localhost/hi时发生问题
连接意外终止

soucket.lua位于此文件夹中:

root@debian:/usr/local/share/lua/5.1# ls
ltn12.lua  mime.lua  socket  socket.lua

更新:添加cpath没有帮助:

lua_package_cpath '/usr/local/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/socket/?.so;;';

# ls /usr/local/lib/lua/5.1/socket/*.so
/usr/local/lib/lua/5.1/socket/core.so  /usr/local/lib/lua/5.1/socket/serial.so  /usr/local/lib/lua/5.1/socket/unix.so

# ls /usr/local/share/lua/5.1/
ltn12.lua  mime.lua  socket  socket.lua

我该如何解决/诊断这个问题? 谢谢

点赞
用户5622901
用户5622901

如果使用的是 diegonehab/luasocket 的 socket.lua, 那么需要 socket/core.so 支持。

需要指定 lua_package_cpath

cpath 用于编译共享库模块 (.so),path 用于文本模块 (.lua)。

/usr/local/lib/lua/5.1/?.so - cpath 的最常见值。

2015-12-16 21:24:50
用户204011
用户204011

不要试图在 nginx 中使用 LuaSocket。LuaSocket 是一个阻塞库,而 nginx 是非阻塞的,所以你将会遇到问题。代替它,可以查看 ngx.socket.tcp。它的 API 与 socket.tcp 兼容,但它是非阻塞的。

2015-12-16 22:04:54