Node.js - 如何转发HTTP流量(反向代理)?

时间:2014-06-04 14:48:33

标签: javascript node.js reverse-proxy

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

gateway将是唯一可见的服务,它需要将流量转发到内部服务网络。一个简单的302在这里不起作用。

如果给出Node.js的异步特性,我怎样才能真实地实现这个呢?

是否有用于此的众所周知的库?

enter image description here

3 个答案:

答案 0 :(得分:1)

使用纯核心模块(可能有点难看,但效率很高):

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

答案 1 :(得分:1)

我使用node-http-proxy进行了管理,其中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);

答案 2 :(得分:1)

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

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

祝你的反向代理努力好运!如果我发生任何其他事情,我会更新此信息。