NodeJS:工作HTTP代理有时会抛出Error Connect ECONNREFUSED

时间:2015-08-02 10:35:07

标签: node.js proxy node-http-proxy

我在端口3000和3001上运行了两台服务器。主代理服务器将端口80上的所有请求重定向到特定服务器。 IP 123.123.123.123将被重定向到端口3000,域example.com将被重定向到3001:

var proxy1 = new httpProxy.createProxyServer();
var proxy2 = new httpProxy.createProxyServer();

http.createServer(function(req, res) {

    if (req.headers.host == '123.123.123.123') {

        proxy1.on('error', function(err) {
            console.log(err);
        });

        proxy1.web(req, res, {
            host: 'http://127.0.0.1:3000'
        });

        console.log('selecting 123.123.123.123');

    } else if (req.headers.host == 'example.com') {

        proxy2.on('error', function(err) {
            console.log(err);
        });

        proxy2.web(req, res, {
            host: 'http://127.0.0.1:3001'
        });

        console.log('selecting example.com');

    } else {
        console.log('nothing');
    }

}).listen(80);

另外两个节点应用程序在另一个脚本中定义的端口3000和30001上运行。

代理正在运作。当我转到123.123.123.123时,我看到应用程序端口3000的结果,当我去example.com时,我看到应用程序的结果是端口3001。

当这个应用程序运行时,不断有人连接到网站或IP。每隔3或4秒就会有一个请求。

问题:

10-30秒后,我在控制台中看到很多(可能是5-15,可能是之前发生的请求数量相同)的错误消息(它们突然出现,而不是请求请求):

  

[错误:连接ECONNREFUSED]

堆栈跟踪没有帮助:

Error: connect ECONNREFUSED
  at exports._errnoException (util.js:746:11)
  at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19)

在错误事件函数中,req.headers.host有时是123.123.123.123,有时是example.com。

我还注意到,只要发生此错误,我就会在两个应用中看到另一个错误,这些错误在端口3000和3001上提供内容,但不在主脚本中提供:

  

[错误:连接ETIMEDOUT]

堆栈跟踪与上面一样有用:

Error: connect ETIMEDOUT
  at exports._errnoException (util.js:746:11)
  at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19)

错误之前和之后,我仍然可以使用提供的特定内容访问ip和域。

可能是什么问题?我怎样才能更接近解决方案?

修改

我使用longjohn来获取更长的堆栈跟踪并将on('error')事件添加到服务器变量以捕获错误,但我仍然不知道为什么会发生这种情况......

0 个答案:

没有答案