Python - ConnectionError:超出了最大重试次数

时间:2013-02-11 18:42:51

标签: python node.js http webserver

当我的服务器(称为服务器A)向我的另一台服务器(所有服务器B)上的资源发出请求时,我偶尔会收到此错误:

ConnectionError: HTTPConnectionPool(host='some_ip', port=some_port): Max retries exceeded with url: /some_url/ (Caused by : [Errno 111] Connection refused)

异常中的消息是
message : None: Max retries exceeded with url: /some_url/ (Caused by redirect)
我包含的内容是因为它有额外的信息(caused by redirect)

正如我所说,我控制了此请求中涉及的两台服务器,因此我可以对其中一项和/或两项进行更改。此外,错误似乎是间歇性的,因为它不会每次都发生。

潜在相关信息 - 服务器A是运行apache的Python服务器,服务器B是NodeJS服务器。我不完全是一个Web服务器向导,除此之外,我不确定哪些信息是相关的。

有没有人确切知道这个错误意味着什么,或者如何调查修复?或者,是否有人知道哪个服务器可能是问题,提出请求的服务器或接收请求的服务器?

修改:我们对外部网络资源的调用也开始出现错误。

3 个答案:

答案 0 :(得分:2)

您在“some_ip”和端口上收到CONN拒绝。这可能是由于    - 没有服务器实际侦听该端口/ IP组合    - 发送Conn Refused的防火墙设置(不太可能是原因!)    - 第三 - 错误配置(更可能)或繁忙的服务器,无法处理请求。

我相信当 - 服务器A正在尝试连接到服务器B时,您收到了该错误。 (假设它是Linux和/或一些unix派生物)netstat -ln -tcp在服务器上显示什么? (man netstat了解标志 - 我们在这里做的是 - 试图找到所有程序正在监听哪个端口)。如果那确实显示你的服务器B正在监听 - iptables -L -n来显示防火墙规则。如果没有什么不对的话 - 最有可能的是侦听队列的错误配置。 (http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/023/2333/2333s2.html)或google for listen backlog。

这很可能是你的服务器B上的一个错误的配置问题。(注意:如上所述的重定向循环 - 未正确处理可能最终导致服务器忙碌!所以可能解决这个也可以解决你的问题)

答案 1 :(得分:1)

如果您在python服务器上使用gevent,则可能需要升级版本。看起来gevent的DNS解析只是一些错误。

这是来自请求库的讨论:https://github.com/kennethreitz/requests/issues/1202#issuecomment-13881265

答案 2 :(得分:-1)

这看起来像是Node端的重定向循环。

您提到服务器B是节点服务器,如果您错误地设置了路由,则可能会意外地创建重定向循环。例如,如果您在服务器B上使用express - 节点服务器,则可能有两条路由,并假设您将路由逻辑保存在单独的模块中:

var routes = require(__dirname + '/routes/router')(app);
//... express setup stuff like app.use & app.configure
app.post('/apicall1', routes.apicall1);
app.post('/apicall2', routes.apicall2);

然后您的routes / router.js可能如下所示:

module.exports = Routes;

function Routes(app){
    var self = this;
    if (!(self instanceof Routes)) return new Routes(app);
    //... do stuff with app if you like
}

Routes.prototype.apicall1 = function(req, res){
    res.redirect('/apicall2');
}
Routes.prototype.apicall2 = function(req, res){
    res.redirect('/apicall1');
}

这个例子很明显,但是你可能在某些路由中隐藏了一系列重定向循环。我将从边缘情况开始,就像在有问题的路由中的条件结束时发生的情况一样,如果调用例如没有正确的参数以及什么是异常行为,那么默认行为是什么?

顺便说一句,您可以使用类似node-validator(https://github.com/chriso/node-validator)的内容来帮助确定和处理不正确的请求或发布参数

// Inside router/routes.js:
var check = require('validator').check;

function Routes(app){ /* setup stuff */ }

Routes.prototype.apicall1 = function(req, res){
    try{
        check(req.params.csrftoken, 'Invalid CSRF').len(6,255);
        // Handle it here, invoke appropriate business logic or model, 
        // or redirect, but be careful! res.redirect('/secure/apicall2');
    }catch(e){
        //Here you could Log the error, but don't accidentally create a redirect loop
        // send appropriate response instead
        res.send(401);
    }
}

为了帮助确定它是否是一个重定向循环你可以做几件事之一,你可以使用curl用相同的帖子参数点击url(假设它是一个帖子,否则你可以只使用chrome,它会如果注意到重定向循环,则在控制台中输出错误),或者您可以在违规路由内的节点服务器或syslog上写入stdout。

希望有帮助,你提到“由重定向引起的”部分的好事,那就是我认为问题。

上面的示例情况使用express来描述情况,但是当然,如​​果您根本不使用任何框架或库,那么问题可以仅使用连接,其他框架甚至您自己的处理程序代码。无论哪种方式,我都习惯于进行良好的参数检查并始终测试你的边缘情况,我在过去匆忙的时候就完全陷入了这个问题。