Node.js – 我将如何转发HTTPstream量(反向代理)?

我需要什么本质上是一个反向代理,但我需要在Node.js中,因为我将不得不放入一些自定义function。

gateway将是唯一可见的服务,它需要将stream量转发到内部服务networking。 一个简单的302不会在这里工作。

我怎么能真正实现这个Node.js的asynchronous性质呢?

有没有使用这个知名的库?

在这里输入图像描述

用纯粹的核心模块(可能有点难看,但有效率):

 var http = require('http'); http.createServer(function (request, response) { if (request.headers.host === 'api.test') { // request data from 172.17.0.1:80 } else if (request.headers.host === 'test') { // request data from 172.17.0.2:80 } else { // Do something else } }).listen(80); 

如果你不喜欢这个例子,你可以试试: https : //www.npmjs.org/package/turtle.io

我已经使用node-http-proxy来pipe理它,其中http://first.test/和http://second.test/是主机名。

 var http = require('http'), httpProxy = require('http-proxy'); var proxy = httpProxy.createProxyServer({}); // reverse proxy server http.createServer(function (req, res) { var target = ''; if (req.headers.host.match(/first.test/)) { target = 'http://127.0.0.1:8001'; } else if (req.headers.host.match(/second.test/)) { target = 'http://127.0.0.1:8002'; } console.log(req.headers.host, '->', target); proxy.web(req, res, { target: target }); }).listen(8000); // test server 1 http.createServer(function(req, res) { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.write('8001\n'); res.write(JSON.stringify(req.headers, true, 2)); res.end(); }).listen(8001); // test server 2 http.createServer(function(req, res) { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.write('8002\n'); res.write(JSON.stringify(req.headers, true, 2)); res.end(); }).listen(8002); 

对于使用反应堆模式的简单逆向代理(如节点),我会检查nginx。 但是,您提到您想要使用节点添加一些自定义function,那么这是一个现实的目标吗? 绝对! 在devise您的反向代理时,需要考虑以下几点:

  • 你将如何跟踪传入的请求需要结束? 例如,如果你用/ test / *代理所有请求到你的UI,但是返回的HTML有根相对URL(/imgs/banner.jpg),你如何跟踪后续请求需要去的地方(特别是如果它来自JavaScript)? 你打算把你的代理和后端应用程序紧密结合吗? 或者你可以考虑设置一个cookie来跟踪。
  • 这个东西是否需要扩展? 如果你的答案是否定的,我的跟进是 – 你确定? 如果你真的只需要代理两个后端应用程序,我相信有很多聪明的方法来实现这一点。 如果在任何时候你可能有N个后端应用程序,那么你需要一个稳定的计划来pipe理(添加/删除/更新)它们在代理上。
  • 你的应用程序使用HTTPS吗? 如果是这样,你打算在代理上终止SSL吗? 您可以在代理和后端应用程序之间清楚地发送数据吗?

祝你的反向代理服务器的努力! 如果有其他事情发生在我身上,我会更新。