3

単純なnode.jsリバースプロキシを実行して、同じポート80で複数のNode.JSアプリケーションとApacheサーバーをホストしたいので、この例をここで見つけました

var http = require('http')
, httpProxy = require('http-proxy');

httpProxy.createServer({
    hostnameOnly: true,
    router: {
        'www.my-domain.com': '127.0.0.1:3001',
        'www.my-other-domain.de' : '127.0.0.1:3002'
    }
}).listen(80);

問題は、たとえばapp1.my-domain.comがlocalhost:3001を指し、app2.my-domain.comがlocalhost:3002を指し、他のすべてがポート3000に移動するようにしたいことです。実行されます。「デフォルト」ルートの設定方法に関するドキュメントには何も見つかりませんでした。

何か案は?

編集Apacheサーバーによって処理されるドメイン/サブドメインがたくさんあり、新しいサブドメインを追加するたびにこのルーティングテーブルを変更する必要がないため、これを実行したいと思います。

4

2 に答える 2

10

ほぼ 1 年間、受け入れられた回答を使用してデフォルトのホストを使用することに成功しましたが、node-http-proxy がホスト テーブルで RegEx を許可するようになったはるかに簡単な方法があります。

var httpProxy = require('http-proxy');

var options = {
  // this list is processed from top to bottom, so '.*' will go to
  // '127.0.0.1:3000' if the Host header hasn't previously matched
  router : {
    'example.com': '127.0.0.1:3001',
    'sample.com': '127.0.0.1:3002',
    '^.*\.sample\.com': '127.0.0.1:3002',
    '.*': '127.0.0.1:3000'
  }
};

// bind to port 80 on the specified IP address
httpProxy.createServer(options).listen(80, '12.23.34.45');

hostnameOnlytrue に設定していないことが必要です。そうしないと、RegEx が処理されません。

于 2013-06-25T20:40:34.100 に答える
3

これは node-http-proxy に組み込まれていませんが、コーディングは簡単です。

var httpProxy = require('http-proxy'),
    http = require('http'),
    addresses;

    // routing hash
addresses = {
  'localhost:8000': {
    host: 'localhost',
    port: 8081
  },
  'local.dev:8000': {
    host: 'localhost',
    port: 8082
  },
  'default': {
    host: 'xkcd.com',
    port: 80
  }
};

// create servers on localhost on ports specified by param
function createLocalServer(ports) {
  ports.forEach(function(port) {
    http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/html'});
      res.end('<h1>Hello from ' + port + '</h1');
    }).listen(port);
  });
  console.log('Servers up on ports ' + ports.join(',') + '.');  
}
createLocalServer([8081, 8082]);

console.log('======================================\nRouting table:\n---');
Object.keys(addresses).forEach(function(from) {
  console.log(from + ' ==> ' + addresses[from].host + ':' + addresses[from].port);
});

httpProxy.createServer(function (req, res, proxy) {
  var target;

      // if the host is defined in the routing hash proxy to it
      // else proxy to default host
  target = (addresses[req.headers.host]) ? addresses[req.headers.host] : addresses.default;

  proxy.proxyRequest(req, res, target);
}).listen(8000);

ポート 8000 で localhost にアクセスすると、localhost ポート 8081 にプロキシされます。

ポート 8000 (ルーティング ハッシュでは定義されていません) で 127.0.0.1 にアクセスすると、デフォルトの「場所」、つまりポート 80 の xkcd.com に移動します。

于 2012-06-07T12:38:59.780 に答える