Lua open socket error

我正在使用 Lua 作为 nginx(openresty)模块从远程主机获取文件。我的函数:

function readfile(url)
  local http = require ("socket.http")
  if not http then
    error("无法打开 socket.http")
  end
  http.TIMEOUT = 5
  local body, code = http.request(url)
  if not body then
    error("无法读取远程文件:" .. code)
  end
  return body
end

我已通过使用 Siege 来测试此代码。当我将用户设置为100个以上时,就会捕获到此错误:

2018/03/27 09:36:38 [info] 10#10: *91018 shutdown() 失败 (107: Socket 未连接), 客户端:172.18.0.7,服务器:localhost

我设置更多用户时遇到了更多的错误。这意味着什么?谢谢帮助。

点赞
用户2060502
用户2060502

不要在OpenResty中使用luasocket库。这会导致代码在 http.request() 上阻塞。

我猜所有的nginx worker都被阻塞了,这就是这些错误出现的原因。

为了您的目的,您可以使用以下库之一:

第一个更灵活,允许使用安全传输。 第二个具有更简单的API。

并且两者都内部使用nginx Lua cosocket API,在开箱即用时100%非阻塞。

2018-03-28 11:28:49
用户9090571
用户9090571

lua-resty-httplua-resty-http-simple 在 HTTP 上下文的 init_by_lua 中无法工作。但在 init 上下文中使用,其中阻塞不会被视为有害,是可以的。

2021-05-04 18:32:17