错误:连接EMFILE和node-http-proxy

时间:2014-01-28 15:05:09

标签: node.js express proxy restify node-http-proxy

我有一些节点进程,我正在尝试将代理转换为一个localhost端口。 Node-http-proxy似乎是最简单的解决方案。我正在代理一些运行express的node.js进程(下例中的端口3100和3000),以及运行带有restify(2700)的node.js的进程。

var http = require('http'),
    httpProxy = require('http-proxy');

var proxy = httpProxy.createProxyServer({});

var server = require('http').createServer(function(req, res) {
    if (req.url.match(/^(\/api\/search|\/api\/suggest)/g)) {
        proxy.web(req, res, { target: 'http://127.0.0.1:2700' });
    } else if (req.url.match(/^\/pages\//g)){
        proxy.web(req, res, { target: 'http://127.0.0.1:3100' });
    } else {
        proxy.web(req, res, { target: 'http://127.0.0.1:3000' });
    }
});

server.listen(9999);

因此,在测试期间,我开始意识到9999处的服务器在大约100个服务器之后停止提供服务,并且看到节点-http-proxy进程正在抛出:

{ [Error: connect EMFILE] code: 'EMFILE', errno: 'EMFILE', syscall: 'connect' }

我知道EMFILE通常是由打开文件的限制操作系统引起的。我可以达到极限,但我认为这不会有所帮助。我尝试通过每100毫秒进行一次循环连接来运行访问3000,3100和2700的服务器,一切都很顺利,成千上万的服务没有任何问题。我也在nginx反向代理后面运行它,它在成千上万的服务上成功运行。我觉得我在使用node-http-proxy做错了 - 就像我没有关闭一些东西。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这很可能是因为没有代理人通过 所以Node分配新的代理来处理每个请求 并且因为保持活动节点不会在请求后终止连接 所以它会泄漏

临时解决方案: -

1 - 您可以为每个请求分配新代理

var proxy = httpProxy.createProxyServer({agent: new http.Agent()});

2-您将连接发送到请求标题附近

server = http.createServer(function(req, res) {
  req.headers.connection = "Close";
  return proxy.web(req, res, {
    target: 'http://127.0.0.1'
  });
});

参考: -

https://github.com/nodejitsu/node-http-proxy/issues/570

https://github.com/nodejitsu/node-http-proxy/pull/572

https://github.com/nodejitsu/node-http-proxy/pull/573