我在端口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')事件添加到服务器变量以捕获错误,但我仍然不知道为什么会发生这种情况......