Python—ConnectionError:超过最大重试次数
当我的服务器(称为服务器A)向另一台服务器(全it服务器B)上的资源发出请求时,我偶尔会遇到此错误:Python—ConnectionError:超过最大重试次数,python,node.js,http,webserver,Python,Node.js,Http,Webserver,当我的服务器(称为服务器A)向另一台服务器(全it服务器B)上的资源发出请求时,我偶尔会遇到此错误: ConnectionError:HTTPConnectionPool(host='some_ip',port=some_port):url超过了最大重试次数:/some_url/(由:[Errno 111]连接被拒绝引起) 异常中的消息是 消息:无:url:/some\u url/(由重定向引起)超过了最大重试次数 我之所以包括它,是因为它有额外的信息(由重定向引起) 正如我所说,我控制这个请求
ConnectionError:HTTPConnectionPool(host='some_ip',port=some_port):url超过了最大重试次数:/some_url/(由:[Errno 111]连接被拒绝引起)
异常中的消息是消息:无:url:/some\u url/(由重定向引起)超过了最大重试次数
我之所以包括它,是因为它有额外的信息(由重定向引起)
正如我所说,我控制这个请求中涉及的两个服务器,因此我可以对其中一个和/或两个服务器进行更改。此外,该错误似乎是间歇性的,因为它并非每次都发生
潜在相关信息——服务器A是运行apache的Python服务器,服务器B是NodeJS服务器。我并不完全是一个web服务器向导,所以除此之外,我不确定哪些信息是相关的
是否有人确切知道此错误的含义,或者如何着手调查修复?或者,是否有人知道哪个服务器可能是问题所在,是发出请求的服务器还是接收请求的服务器
编辑:我们对外部web资源的调用也开始出错。这看起来像是节点端的重定向循环
如果提到服务器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');
}
这个例子很明显,但在某些路由中,可能有一个重定向循环隐藏在一堆条件中。我将从边缘案例开始,比如所讨论的路由中的条件结束时发生的情况,如果调用(例如)没有正确的参数,那么默认行为是什么,异常行为是什么
另外,您可以使用节点验证器()之类的工具来帮助确定和处理错误的请求或post参数
// 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以相同的post参数点击url(假设它是一个post,否则您可以使用chrome,如果它注意到重定向循环,它将在控制台中出错),或者,您可以写入节点服务器上的stdout,或者在有问题的路由中注销syslog
希望对你有所帮助,幸好你提到了“重定向引起的”部分,那就是我认为的问题
上面的示例情况使用express来描述这种情况,但是如果您根本不使用任何框架或库,当然问题也可以通过使用connect、其他框架甚至您自己的处理程序代码来解决。不管是哪种方式,我都习惯于进行良好的参数检查,并始终测试您的边缘情况,我在过去很匆忙的时候就遇到了这个问题。您在“某些ip”和端口上的连接被拒绝。那很可能是因为
-没有服务器实际侦听该端口/IP组合
-发送Conn的防火墙设置被拒绝(不太可能是原因!)
-第三,服务器配置错误(更有可能)或繁忙,无法处理请求
我相信,当服务器A试图连接到服务器B时,您会遇到该错误。(假设它是Linux和/或某些unix衍生产品)netstat-ln-tcp在服务器上显示什么?(man netstat了解标志-我们在这里做的是-试图找到所有程序都在哪个端口上侦听)。如果这确实显示您的服务器B正在侦听-iptables-L-n以显示防火墙规则。如果没有问题,很可能是侦听队列的配置不好。()或谷歌搜索
这很可能是服务器B上的错误配置问题。(注意:上面提到的重定向循环-处理不正确可能会导致服务器繁忙!因此解决这个问题也可能解决您的问题)如果您在python服务器上使用gevent,您可能需要升级版本。看起来gevent的DNS解析有一些bug
这是一个来自请求库的讨论:您能提供关于服务器a的更多详细信息吗,比如您正在导入哪些库。我使用Python请求库使请求很难说,但您似乎配置了前端Apache,将URL重定向到另一个未转发到nodejs的URL。我认为这里的apache配置是重要的数据。@uʍopǝpısdn apache config是哪个服务器的,A还是B?不能确切地说出来。如果您使用的是代理:以上错误将被排除。这是一个IP问题,表明服务器进程没有运行,与HTTP重定向没有任何关系。繁忙的服务器不会发送ECONREFUNCE,除非服务器进程因负载过高而崩溃。不过,这可能是关于每秒连接数过多的防火墙规则。我会在讨论中的服务器上显示详细信息。没有更多的挖掘就帮不了你。