WebSocket を通す ReverseProxy が欲しいの
Node.js で socket.io 使ってウェブチャット作って遊ぶ! とかやってると、そのうち作ったアプリを自宅サーバとかで公開したくなるのが人の世の常というものですが。
とくに考えずに自宅サーバで作ったアプリを動かそうとすると、 「Node.js で作ったアプリをポート3000番で動かしてー、フロントサーバとして Apache か nginx を置けば良いやー」 って感じで上の図のような構成になると思いますー。が (そもそもイベントループが売りの Node.js のフロントサーバが Apache ってどうなの?ってのは置いといて。)
ふと気づく。クライアントからの WebSocket が届いてねえ!
はい、対応してないんですよね、Apache も nginx も、WebSocket のプロキシは。
仕方ないので無理矢理動かそうとすると、Node.js アプリが動いてるポートを開くことになる。 こんなんするんだったら、フロントサーバいらないんじゃないって気もするが。
node-http-proxy
ということで、ちょろっと調べてみたところ、 WebSocket に対応したリバースプロキシ発見。 なんと node.js 製…。
こいつをフロントサーバとして Port 80 で動かして、後ろに Port 3000 で動くウェブアプリを置くとすると、 以下のような設定になるっぽい。
var httpProxy = require('http-proxy');
httpProxy.createServer({
router: {
'localhost': 'localhost:3000'
}
}).listen(80);
名前ベースで振り分けもできる。
var httpProxy = require('http-proxy');
httpProxy.createServer({
router: {
'foo.com': '127.0.0.1:8001',
'bar.com': '127.0.0.1:8002'
}
}).listen(80);
イベントベースのウェブサーバで WebSocket も対応してるので、 フロントサーバとして Apache からの置き換えも考えちゃうなーこれは。
と、いいつつ、、、設定ファイルの書き換えが面倒なので全然手を付けてないが…。