11

当我的服务器(称为服务器 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 服务器。我不完全是一个网络服务器向导,所以除此之外,我不确定哪些信息是相关的。

有谁知道这个错误的确切含义,或者如何着手调查修复?或者,有谁知道哪台服务器可能是问题,发出请求的服务器,还是接收请求的服务器?

编辑:我们对外部网络资源的调用也开始发生错误。

4

3 回答 3

2

您在“some_ip”和端口上得到一个 CONN Refused。这可能是由于 - 没有服务器实际监听该端口/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 ) 或谷歌收听积压。

这很可能是您的服务器 B 上的错误配置问题。(注意:上面提到的重定向循环 - 未正确处理可能最终导致服务器繁忙!因此可能解决该问题也可以解决您的问题)

于 2013-12-14T03:49:51.503 回答
1

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

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

于 2014-03-08T18:58:46.993 回答
-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,它会出错如果控制台注意到重定向循环),或者您可以写入节点服务器上的标准输出或在有问题的路由内写入系统日志。

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

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

于 2013-06-15T15:01:24.597 回答