: O. Yuanying

WebSocket を通す ReverseProxy が欲しいの

Node.jssocket.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 からの置き換えも考えちゃうなーこれは。

と、いいつつ、、、設定ファイルの書き換えが面倒なので全然手を付けてないが…。