我有一个 nodejs 代码在测试时通过 HTTP 在本地主机上发布数据,我发现一旦连接数达到 1024,它就会开始出现以下错误:
getaddrinfo EADDRINFO
我增加了最大连接限制并通过建立更多连接测试了 HTTP 服务器,同时我使用 curl
通过 Node 代码收到此错误,它能够毫无故障地建立连接。
这是发布数据的代码片段:
function post(message, domain, callback){
var self=this;
var json = JSON.stringify(message);
var p = url.parse(domain);
var headers = {
'Content-Type': 'application/json',
'Content-Length': json.length
};
console.log('hostname: ' + p.hostname);
var options = {
host: p.hostname,
port: p.port,
path: p.pathname,
method: 'POST',
headers: headers
};
var req = http.request(options, function(res) {
res.setEncoding('utf-8');
var responseString = '';
res.on('data', function(data) {
responseString += data;
});
res.on('end', function() {
logger.info(responseString);
self.responseQ.push(responseString);
callback(self,message,'success');
});
});
req.on('error', function(e) {
//TODO: handle error.
logger.error('[e] Error while posting: '+e);
callback(self, message,'failure');
});
logger.info("post: "+json);
req.write(json);
req.end();
}
我认为可能存在一些问题(即使我使用的是本地主机)我尝试用 IP 地址替换 host
;然后在工作 2 分钟后,相同的代码开始以类似的方式出现以下错误:
Error: connect EMFILE
什么可能导致代码在两者之间中断?
如有任何帮助,我们将不胜感激。
最佳答案
在尝试了多种方案后,我发现可能导致此问题的原因如下:
- 如果您使用的是域名(DNS 可能是个问题)
- 您进程的最大文件限制。
在我的案例中,失败的具体原因是案例 2;在这种情况下,我的 nodejs 进程可以打开的文件的最大限制被限制为 1024
而网络服务器可以接受更多连接。
在这种情况下所需要做的就是更改限制。
- 检查您的用户的限制:
$su - 用户名 $ulimit -Hn $ulimit -Sn
根据您的需要更改值:
vi/etc/security/limits.conf
添加以下几行
username soft nofile 4096
username hard nofile 10240
更改系统范围内打开文件的限制:
vi/etc/sysctl.conf
添加以下行
fs.file-max = 100000
- 最后通过重复第 1 步来检查您的更改,以确保正确应用所有所做的更改。
关于node.js - 在 http post 导致 : getaddrinfo EADDRINFO 后工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32897287/