单端口路由到不同的服务

时间:2020-09-08 17:09:13

标签: javascript node.js reverse-proxy http-proxy node-http-proxy

我的问题是:是http-proxyreverse-proxy.js还是任何其他能够将到达端口80的所有请求路由到基于其他服务的库(如nginx这样的网络服务器除外)在网址上?

如果端口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 个答案:

答案 0 :(得分:0)

当然可以。这是非常常见的要求。在Node中,您可以使用流在本地执行此操作。这是一个仅使用标准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);