簡體   English   中英

Node.js-我將如何轉發HTTP通信(反向代理)?

[英]Node.js - How would I forward HTTP traffic (reverse proxy)?

我需要本質上是反向代理的東西,但是我需要在Node.js中使用它,因為我將不得不添加一些自定義功能。

gateway將是唯一可見的服務,它需要將流量轉發到內部服務網絡。 簡單的302在這里不起作用。

鑒於Node.js的異步特性,我該如何現實地實現它?

是否有為此使用的知名庫?

在此處輸入圖片說明

使用純核心模塊(可能有點難看,但有效):

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來管理它,其中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。 但是,您提到您想使用節點添加一些自定義功能,所以這是一個現實的目標嗎? 絕對! 在設計反向代理時,需要考慮以下幾點:

  • 您將如何跟蹤傳入請求在何處結束? 例如,如果將所有帶有/ test / *的請求代理到您的UI,但是返回的HTML具有根相對URL(/imgs/banner.jpg),那么如何跟蹤后續請求的去向(特別是如果它來自javascript)? 您是否要緊密耦合代理和后端應用程序? 或者,您可以考慮設置cookie以保持跟蹤。
  • 這個東西根本不需要擴展嗎? 如果您的回答為“否”,那么我的后續行動是-您確定嗎? 如果您真的只需要代理兩個后端應用程序,那么我相信可以通過多種巧妙的方法來實現。 如果任何時候您可能有N個后端應用程序,那么您需要一個可靠的計划來在代理上管理(添加/刪除/更新)它們。
  • 您的應用程序使用HTTPS嗎? 如果是這樣,您是否要終止代理上的SSL? 您可以在代理和后端應用程序之間明文發送數據嗎?

祝您反向代理事業順利! 如果我有其他事情發生,我將進行更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM