Node.js群集模块不会在http.Server.close()上释放套接字/端口

马可·吕西(MarcoLüthy)

在Node.js脚本中,我试图打开一些端口/套接字,然后再次将其关闭。使用Node.js群集模块时遇到麻烦。在不使用集群模块时,似乎没有以与相同代码相同的方式关闭端口。

例如,采用以下代码,该代码在其自己的端口上分别创建5个http.Server,然后关闭除最后一个(第5个)之外的所有端口。

'use strict';

var http = require('http');

function goGoGadget(i) {
    console.log('var i = ', i);

    var httpServer = http.createServer();
    var nextPort = 4000 + i;

    console.log('about to listen on port', nextPort);
    httpServer.listen(nextPort);

    if (i < 5) {
        httpServer.on('listening', function() {
            console.log('closing port:', nextPort);
            httpServer.close(function() {
                console.log('closed server on port:', nextPort);
            });
        });
    }
}

goGoGadget(1);
goGoGadget(2);
goGoGadget(3);
goGoGadget(4);
goGoGadget(5);

与预期的一样,node.js仅打开了一个端口:

dhcp50:test marco$ lsof -i -n -P | grep node
node      20895 marco   16u  IPv4 0xb242422d2e0e2bb1      0t0  TCP *:4005 (LISTEN)

然后,使用相同的代码,但使用“群集”模块在工作程序中运行:

'use strict';

var cluster = require('cluster');
var http = require('http');

function goGoGadget(i) {
    console.log('var i = ', i);

    var httpServer = http.createServer();
    var nextPort = 4000 + i;

    console.log('about to listen on port', nextPort);
    httpServer.listen(nextPort);

    if (i < 5) {
        httpServer.on('listening', function() {
            console.log('closing port:', nextPort);
            httpServer.close(function() {
                console.log('closed server on port:', nextPort);
            });
        });
    }
}

if (cluster.isMaster) {
    var numWorkers = 5;

    for (var i = 0; i < numWorkers; i += 1) {
        console.log ('forking ', i + 1);
        cluster.fork();
    }
}
else {
    goGoGadget(cluster.worker.id);
}

这次,Node.js会保留前四个http.Server的端口,即使它们已关闭:

dhcp50:test marco$ lsof -i -n -P | grep node
node      20900 marco   17u  IPv4 0xb242422d2d9682e1      0t0  TCP *:4004 (LISTEN)
node      20900 marco   18u  IPv4 0xb242422d2d5faa11      0t0  TCP *:4001 (LISTEN)
node      20900 marco   19u  IPv4 0xb242422d2d5fd621      0t0  TCP *:4005 (LISTEN)
node      20900 marco   20u  IPv4 0xb242422d2d985141      0t0  TCP *:4002 (LISTEN)
node      20900 marco   21u  IPv4 0xb242422d2d9862e1      0t0  TCP *:4003 (LISTEN)
node      20905 marco   13u  IPv4 0xb242422d2d5fd621      0t0  TCP *:4005 (LISTEN)

我的问题很简单:为什么?以及如何关闭它们?我怀疑如果我net.Server.listen()中使用了独占选项,则端口可能会关闭,但是http.Server.listen() API似乎并未将此选项哈希作为参数。

这个问题的起源来自一个问题:当使用幻影节点(带有phantomjs)在使用Cluster模块的Express.js应用程序中随时间打开许多页面时。为了确保在创建新的幻像节点实例时不会发生端口冲突,并且要避免EADDRINUSE,我进行了端口扫描,并检查了我要使用的端口是否可用。问题在于,随着时间的流逝,越来越多的端口被打开,并且由于它们从未关闭过,因此节点最终会因EMFILE错误而崩溃

马可·吕西(MarcoLüthy)

看来,所描述的问题是通过Node v0.11.1出现的。从0.11.2起,套接字在关闭时已成功取消链接。通过此提交修复

凉爽的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Node.js群集模块不会在http.Server.close()上释放套接字/端口

来自分类Dev

半打开套接字上的select()是否不会在close()上返回?

来自分类Dev

Node.js:http.server,http.agent,套接字和http.request之间的关系

来自分类Dev

Node.js:http.server,http.agent,套接字和http.request之间的关系

来自分类Dev

长POST node.js上的套接字超时

来自分类Dev

长POST node.js上的套接字超时

来自分类Dev

PyZMQ PUSH套接字不会在send()上阻塞

来自分类Dev

在Node JS上生成(Windows Server 2012)

来自分类Dev

套接字在http.request上挂接到Node.js MongoDb服务器

来自分类Dev

数据不会在Node-Webkit,AngularJS和mysql中的承诺实现上绑定

来自分类Dev

从Client.py到Node Server.js的套接字[SSL:CERTIFICATE_VERIFY_FAILED](_ssl.c:590)

来自分类Dev

从Client.py到Node Server.js的套接字[SSL:CERTIFICATE_VERIFY_FAILED](_ssl.c:590)

来自分类Dev

redis-server多次运行会在同一端口上绑定多个侦听套接字吗?

来自分类Dev

Web套接字服务器在带有Node命令的Ubuntu 12.04终端上不起作用(node server.js)

来自分类Dev

Node.js套接字连接错误

来自分类Dev

Node js的多个路由获取套接字

来自分类Dev

Laravel Node.js套接字IO

来自分类Dev

监视Node.js HTTP Server的命令

来自分类Dev

在Linux上从node.js访问SQL Server

来自分类Dev

HTTP服务器不会在端口8000上侦听

来自分类Dev

带有python套接字的HTTP Server

来自分类Dev

async.map不会在Node.js中调用回调

来自分类Dev

Node.js不会在第一次使用Promise更改数据

来自分类Dev

事件不会在使用 Node js 和 socket.io 的客户端上触发

来自分类Dev

angularjs $ http服务不会在POST上设置cookie,但会在GET上设置cookie

来自分类Dev

并行执行CREATE DATABASE语句会导致错误,但不会在单独的SQL Server实例上发生

来自分类Dev

将请求发布到Node-http-proxy Node.js时发生套接字挂断

来自分类Dev

http模块上的node.js response.writeHead

来自分类Dev

http模块上的node.js response.writeHead

Related 相关文章

  1. 1

    Node.js群集模块不会在http.Server.close()上释放套接字/端口

  2. 2

    半打开套接字上的select()是否不会在close()上返回?

  3. 3

    Node.js:http.server,http.agent,套接字和http.request之间的关系

  4. 4

    Node.js:http.server,http.agent,套接字和http.request之间的关系

  5. 5

    长POST node.js上的套接字超时

  6. 6

    长POST node.js上的套接字超时

  7. 7

    PyZMQ PUSH套接字不会在send()上阻塞

  8. 8

    在Node JS上生成(Windows Server 2012)

  9. 9

    套接字在http.request上挂接到Node.js MongoDb服务器

  10. 10

    数据不会在Node-Webkit,AngularJS和mysql中的承诺实现上绑定

  11. 11

    从Client.py到Node Server.js的套接字[SSL:CERTIFICATE_VERIFY_FAILED](_ssl.c:590)

  12. 12

    从Client.py到Node Server.js的套接字[SSL:CERTIFICATE_VERIFY_FAILED](_ssl.c:590)

  13. 13

    redis-server多次运行会在同一端口上绑定多个侦听套接字吗?

  14. 14

    Web套接字服务器在带有Node命令的Ubuntu 12.04终端上不起作用(node server.js)

  15. 15

    Node.js套接字连接错误

  16. 16

    Node js的多个路由获取套接字

  17. 17

    Laravel Node.js套接字IO

  18. 18

    监视Node.js HTTP Server的命令

  19. 19

    在Linux上从node.js访问SQL Server

  20. 20

    HTTP服务器不会在端口8000上侦听

  21. 21

    带有python套接字的HTTP Server

  22. 22

    async.map不会在Node.js中调用回调

  23. 23

    Node.js不会在第一次使用Promise更改数据

  24. 24

    事件不会在使用 Node js 和 socket.io 的客户端上触发

  25. 25

    angularjs $ http服务不会在POST上设置cookie,但会在GET上设置cookie

  26. 26

    并行执行CREATE DATABASE语句会导致错误,但不会在单独的SQL Server实例上发生

  27. 27

    将请求发布到Node-http-proxy Node.js时发生套接字挂断

  28. 28

    http模块上的node.js response.writeHead

  29. 29

    http模块上的node.js response.writeHead

热门标签

归档