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

Cla*_*ell 11 python webserver http node.js

当我的服务器(称为服务器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服务器向导,除此之外,我不确定哪些信息是相关的.

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

编辑:错误已经开始,我们也调用了外部Web资源.

hoo*_*nto -1

这看起来像节点端的重定向循环。

您提到服务器 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);
Run Code Online (Sandbox Code Playgroud)

那么你的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');
}
Run Code Online (Sandbox Code Playgroud)

该示例很明显,但您可能在其中一些路由的一堆条件中隐藏了重定向循环。我将从边缘情况开始,例如相关路由中条件语句末尾发生的情况,如果调用没有正确的参数,默认行为是什么,异常行为是什么?

顺便说一句,您可以使用诸如 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

为了帮助确定它是否是一个重定向循环,您可以执行以下操作之一,您可以使用curl来使用相同的post参数点击url(假设它是一个post,否则您可以只使用chrome,它会在控制台(如果它注意到重定向循环),或者您可以写入节点服务器上的标准输出或违规路由内部的系统日志。

希望有所帮助,好消息是您提到了“由重定向引起”部分,我认为这就是问题所在。

上面的示例情况使用express来描述这种情况,但当然,如果您根本不使用任何框架或库,则仅使用 connect、其他框架甚至您自己的处理程序代码也可能存在问题。无论哪种方式,我都会养成良好的参数检查并始终测试边缘情况的习惯,当我过去很匆忙时,我就遇到了这个问题。