NodeJS HTTP Server需要很长时间才能关闭

时间:2012-01-05 22:55:25

标签: node.js express zappa

我正在开发一个Zappa应用程序,我正在尝试制作一个停止服务器的小型监视脚本,清除require.cache然后重新要求并在文件更改时重新启动服务器,类似于:

# watch all dependent files
for file of require.cache
  fs.watch file, ->
    # attach a handler to 'close'
    # -- here's the issue: this takes far too long to trigger
    server.on 'close', ->
      server = require './server'
      server.start()

      # log the new server's id
      console.log server.id

    # stop the current server instance
    server.stop()

    # clear require's cache
    delete require.cache[f] for f of require.cache

我的请求处理程序中也有console.log server.id行,因此我可以检查ID是否匹配。

所以,会发生什么:当我更改依赖关系时,服务器停止,新服务器启动并记录新ID,这都是很好的。但是,对于随后的一段时间后,对服务器的请求仍然记录旧ID,表明旧的侦听器仍然以某种方式连接。最终,监听器似乎“切换”并记录新的ID。

更新:它似乎与close事件有关(不出所料) - 如果我将简单console.log 'close'回调附加到close事件, ID {1}}出现后ID开始变化。但是,'close'事件可能需要很长时间(10秒+),为什么需要这么长时间?

2 个答案:

答案 0 :(得分:3)

根据node.js docs

  

server.close()

     

停止服务器接受新连接。请参见net.Server.close()。

因此,您的服务器将停止接受新连接,但在当前连接关闭之前,它实际上不会关闭(并发出close事件)。我的猜测是你有客户端连接到它,可能有keep-alive个请求。

答案 1 :(得分:0)

我正在寻找同样的问题。给你和其他人寻找解决方案:

如果项目中没有问题,您可以立即关闭所有连接。这完全解决了我的结束问题。

app.use((req, res, next) => {
    res.setHeader('Connection', 'close');
    next();
});