Маршрут с одним портом к разным сервисам

#javascript #node.js #reverse-proxy #http-proxy #node-http-proxy

#javascript #node.js #обратный прокси #http-прокси #узел-http-прокси

Вопрос:

Мой вопрос: является ли http-прокси, reverse-proxy.js или любая другая библиотека (за исключением веб-сервера, такого как nginx), способная направлять все запросы, поступающие на порт 80, в другие сервисы на основе URL?

Если на порт 80 поступает запрос с этим URL localhost:80/route1 я хочу перенаправить его на службу по адресу localhost:3001

Если на порт 80 поступает запрос с этим URL localhost:80/another-route , я хочу перенаправить его на службу по адресу localhost:3002 . И так далее..

Подводя итог: я хочу предоставить 1 порт (80), а затем направить запрос другим сервисам на основе шаблона URL из запроса. До сих пор я пробовал этот подход ниже, используяreverse-proxy.js но это работает только в том случае, если порт изменяется

 {
  "port": 80,
  "routes": {
    "localhost/test": "localhost:3001",
    "localhost/another-route": "localhost:3002",
    "localhost/another-route-same-service": "localhost:3002",
    "*": 80
  }
}
  

Ответ №1:

Да, конечно, вы можете. Это очень распространенное требование. В Node вы можете сделать это изначально, используя потоки. Вот полный рабочий пример, использующий только стандартную http библиотеку узла.

 const http = require('http');
const server = http.createServer();

let routes = {
    '/test': {
        hostname: 'portquiz.net',
        port: 80
    }
}

function proxy(req, res){
    if (!routes[req.url]){
        res.statusCode = 404;
        res.end();
        return;
    }

    let options = {
        ...routes[req.url],
        path: '', // if you want to maintain the path use req.url
        method: req.method,
        headers: req.headers
    }

    let proxy = http.request(options, function(r){
        res.writeHead(r.statusCode, r.headers);
        r.pipe(res, { end: true });
    })

    req.pipe(proxy, { end: true }).on('error', err => console.log(err))
}

server.on('request', proxy);
server.listen(8080);