Python – ConnectionError:超过最大重试次数

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

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

exception中的消息是
message : None: Max retries exceeded with url: /some_url/ (Caused by redirect)
我之所以包含它是因为它有额外的信息(caused by redirect)

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

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

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

编辑:错误已经开始与我们的外部networking资源调用也发生。

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

我相信时 – 服务器A试图连接到服务器B,你会得到这个错误。 (假设它是Linux和/或一些unix衍生产品)netstat -ln -tcp在服务器上显示的是什么? (man netstat了解标志 – 我们在这里做的是 – 试图find哪个程序正在哪个端口上监听)。 如果确实显示你的服务器B监听 – iptables -L -n来显示防火墙规则。 如果没有什么错误 – 这可能是监听队列的错误configuration。 ( http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/023/2333/2333s2.html )或谷歌收听积压。

这很可能是你的服务器B上一个不好的configuration问题。(注意:上面提到的一个redirect循环 – 没有正确处理可能会导致服务器忙碌!所以可能的解决办法也可以解决你的问题)

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

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

这看起来像Node侧的redirect循环。

您提到服务器B是节点服务器,如果您错误地设置了路由,可能会意外地创build一个redirect循环。 例如,如果在服务器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); 

那么你的路由/ 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'); } 

这个例子是显而易见的,但是你可能有一个redirect循环隐藏在这些路由中的一堆条件中。 我将从边缘案例开始,就像在所讨论的路由条件末尾发生的情况一样,如果调用例如没有正确的参数,什么是exception行为,默认行为是什么?

另外,您可以使用像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); } } 

为了帮助确定它是否是一个redirect循环,你可以做几件事情之一,你可以使用curl命中相同的职位参数的url(假设它是一个职位,否则你可以只使用铬,它会出错如果控制台发现了redirect循环),或者你可以在有问题的路由中写入节点服务器或syslog的stdout。

希望有所帮助,你提到的好东西是“redirect引起的”部分,那就是我认为的问题。

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