node-http-proxyでリバースプロクシを作る、proxyTable相当を実現するには

  • 投稿日:
  • by

node-http-proxyというのはnode.jsでhttpプロクシを作るためのライブラリです。 WebSocketsに対応しているリバースプロクシが作れるということで注目していました。

さて、気づいたら、いつの間にかバージョンアップしていました。

http://blog.nodejitsu.com/node-http-proxy-1dot0/

node-0.10用に書き直してv1.0になったということです。 ところが、以前のバージョンで使えていたProxyTableは使えなくなっていて、 userlandでコーディングしてねということでした。 以前のバージョンではほとんどコーディングしなくても使えるようになっていて それはそれでよかったのですが、v1.0ではシンプルなAPIとなっていて 基本的にコーディングして使うモジュールという位置づけになっています。 個人的にはv1.0の方が好みです。

ProxyTableはないけれど簡単できるよ、というサンプルが上記ブログに乗っていて、 ホスト名で振り分ける例が載っています。 ただ、前のProxyTableはパスでも振り分けられたのです。 完全互換というわけではありませんが、パスで振り分けるサンプルを紹介します。 ついでに、WebSocketsもHTTPSもどんな組み合わせでも大丈夫なように。

というわけで、コードです。

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

var proxyTable = {
  "/path1/": "http://localhost:1234/",
  "/path2/": "http://localhost:2345/",
  "/sslpath3/": "https://localhost:3456/",
  "/sslpath4/": "https://localhost:4567/"
};

var sslOptions = {
  key: fs.readFileSync('key.pem', 'utf8'),
  cert: fs.readFileSync('cert.pem', 'utf8')
};

var proxy = httpProxy.createProxyServer();

function makeHandler(type) {
  return function(req, res, head) {
    for (path in proxyTable) {
      if (req.url.lastIndexOf(path, 0) === 0) {
        if (type === 'web') {
          proxy.web(req, res, {
            target: proxyTable[path]
          })
        } else if (type === 'ws') {
          proxy.ws(req, res, head, {
            target: proxyTable[path]
          })
        } else {
          res.writeHead(500);
          res.end();
        }
        return;
      }
    }
    res.writeHead(404);
    res.end();
  };
}

var proxyServer = http.createServer(makeHandler('web'));
proxyServer.on('upgrade', makeHandler('ws'));
proxyServer.listen(80);

var sslProxyServer = https.createServer(sslOptions, makeHandler('web'));
sslProxyServer.on('upgrade', makeHandler('ws'));
sslProxyServer.listen(443);

いかがでしょう?