我有一些节点进程,我正在尝试将代理转换为一个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做错了 - 就像我没有关闭一些东西。有什么想法吗?
答案 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