工作了一段时间http post导致:getaddrinfo EADDRINFO

时间:2015-10-01 21:38:28

标签: node.js http

我有一个nodejs代码通过HTTP在localhost上发布数据,同时测试我发现一旦连接数达到1024,它就会开始出现以下错误:

getaddrinfo EADDRINFO

我通过使用curl通过节点代码获取此错误,通过建立更多连接来增加最大连接限制并测试HTTP服务器,这可以在没有任何故障的情况下建立连接。

以下是发布数据的代码段:

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();

    }

我认为可能存在一些问题(即使我使用的是localhost)我尝试用IP地址替换host;然后在工作2分钟后,相同的代码开始以类似的方式给出以下错误:

Error: connect EMFILE

可能导致代码间断的原因是什么?

提前感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

尝试多个选项后,我发现以下可能导致此问题的原因:

  1. 如果您使用的是域名(DNS可能有问题)
  2. 您的流程的最大文件限制。
  3. 在我的情况下,具体的失败原因是案例2;在这种情况下,我的nodejs进程可以打开的文件的最大限制限制为1024,而网络服务器可以接受更多连接。

    在这种情况下,所有需要的都是改变限制。

    1. 检查用户的限制: $su - username $ulimit -Hn $ulimit -Sn
    2. 根据您的需要更改值:

      vi /etc/security/limits.conf

    3. 添加以下行

      username soft nofile 4096
      username hard nofile 10240
      
      1. 更改打开文件的系统范围限制:

        vi /etc/sysctl.conf

      2. 添加以下行

        fs.file-max = 100000
        
        1. 最后通过重复步骤1检查您的更改,以确保所有更改都已正确应用。