到不同服务的单一端口路由

Single port route to different services

我的问题是:http-proxy, 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
  }
}

当然可以。这是一个非常普遍的要求。在 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);