node.js http-proxy负载平衡

在我的学习期间,我必须通过http-proxy(模块)创build一个包含2个nodejs webserver和1个nodejs负载均衡器的nod​​ejs webserver环境。 因此,我build立了2个节点js侦听端口8081和8082的实例。示例服务器A(localhost:8081)

var args = process.argv.splice(2); var http = require('http'); function whoareU() { var n = 'A'; return n; } var server = http.createServer(function (req, res) { res.writeHead(200, {'Content-Type' : 'text/plain'}); res.end('Server: ' + whoareU()); }); server.listen(args[0] || 8081); 

… ServerB是类似的,只是改变了端口8082和标识符B.

另一方面,我通过http-proxy侦听端口8080构build了一个“loadbalace”实例

 var http = require('http'), httpProxy = require('http-proxy'); var servers = [{host :'127.0.0.1', port :8081}, {host : '127.0.0.1',port :8082}]; httpProxy.createServer(function (req, res, proxy) { var target = servers.shift(); proxy.proxyRequest(req, res, target); servers.push(target); }).listen(8000); 

我的意图:如果我打开URL 127.0.0.1:8080我想看到更改输出。 “服务器:A”或“服务器:B”。 但它没有工作!!!!!!!!! 消息:

 Error: Must provide a proper URL as target at ProxyServer.<anonymous> (D:\nodejsmain\node_modules\http-proxy\lib\http-p roxy\index.js:68:35) at Server.closure (D:\nodejsmain\node_modules\http-proxy\lib\http-proxy\inde x.js:125:43) at Server.emit (events.js:98:17) at HTTPParser.parser.onIncoming (http.js:2112:12) at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23 ) at Socket.socket.ondata (http.js:1970:22) at TCP.onread (net.js:527:27) 

问题A:为什么? ;-)顺便说一下:127.0.0.1:8081或127.0.0.1:8082的输出工作正常!

除了这个问题(问题B)我的代码:我怎么能理解所有configuration文件中的args [0](server.listen(args [0] || 8081);)…在我做更多简单的configuration,如下面的sniped节目,我不需要它。

 var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, {'content-type': 'text/plain; charset=utf-8'}); response.write('Huhu '); response.end('Stefan\n'); }).listen(8080, '127.0.0.1'); 

所以谢谢你在这两个问题上帮助我(A + B)。

对于问题A,错误消息是

 Error: Must provide a proper URL as target at ProxyServer.<anonymous> (D:\nodejsmain\node_modules\http-proxy\lib\http-proxy\index.js:68:35) 

这意味着,你将一个错误的parameter passing给http-proxy模块。 只要检查http代理文件。

那么你最好把你的代理代码改成这样:

 var http = require('http'), httpProxy = require('http-proxy'); var servers = ['http://127.0.0.1:8002', 'http://127.0.0.1:8003', 'http://127.0.0.1:8002']; var proxy = httpProxy.createProxyServer(); var count = 0; http.createServer(function(req,res){ loadBalanceProxy(req,res); }).listen(8000); var currentServer = 1; function loadBalanceProxy(req, res){ var cur = currentServer%servers.length; currentServer++; var target = servers[cur]; proxy.web(req, res, { target: target }); } 

PS当我尝试这个代码,如果我只是设置服务器到这个:

  var servers = ['http://127.0.0.1:8002', 'http://127.0.0.1:8003']; 

然后我打开网页

 http://127.0.0.1:8000 

它将永远是“ServerA”。

导致在你的浏览器中,它会发送另一个请求从你的服务器获取“/favicon.ico”。 这意味着你的http服务器将处理一个“简单文本”页面两次请求。

这里是相对的问题: “nodejs – http.createServer似乎调用两次”

对于问题B:参数等于process.argv.splice(2)

 var args = process.argv.splice(2); 

所以在nodejs文件中检查process.argv的描述:

“一个包含命令行参数的数组,第一个元素是'node',第二个元素是JavaScript文件的名字,下一个元素是任何附加的命令行参数。

当你在terminalinput这个命令时:

 node server.js test test2 

这是你的process.argv:

 argv[0] => node argv[1] => you/path/to/server.js argv[2] => test argv[3] => test2 

那么你的参数意味着

 ['test', 'test2'] 

好好享受: )