MJHD

エモさ駆動開発

apache2.2において、ProxyPassがwebsocket通信を通さない

今までbutterflyGateOneなどの、webを使ったターミナルエミュレータを試してきたのだが、なぜか全てのターミナルエミューレータがまともに動かない。

これらのターミナルエミュレータはそれぞれのポートを使ってインターフェースを公開しているのだが、それを80番ポートで公開するために、ProxyPassとVirtualHostを使っていた。 実は、ここに問題があったようで、通常のhttp, https通信はきちんとそれぞれのポートに渡してくれるのだが、WebSocket通信(ws, wss)についてはProxyPassがきちんと効いてないことが分かった。(こちら)

そこで、wstunnelのパッチを当てて、モジュールだけコンパイルして使ってみたのだが、動かず、結局最新版のapache2.4.9をコンパイルして入れることになった。

ProxyPass / http://127.0.0.1:8080/
ProxyPass /ws/ ws://127.0.0.1:8080/ws/
ProxyReserve...(以下略)

のように設定することで、めでたくProxyPassでWebSocket通信を渡すことができた。

その他の手段

wstunnel.patchを当てる、apache2.4を入れる以外にも解決手段はあり、 最終的にはそちらを採用したため、ここに書き留めておく。

具体的には、node-http-proxyを使う方法、 nginxを入れる方法がある。

node-http-proxyを使う方法では、ほぼJavaScriptでリバースプロキシサーバを自分で作るような方法なので(割と簡単だけど)他の方法よりかなり柔軟に対応できると思う。今回の状況では、

#############   ####################   ###################
#Apache:8080# ← #node-http-proxy:80# → #Application1:5555#
#############   ####################   ###################
                        ↓
                ###################
                #Application2:8888#
                ###################

みたいに、Apacheを別のポートでListenさせて、80番ポートに来たリクエストをnode-http-proxyが振り分ける、とすればよい。

自分の環境では、node-http-proxyがエラーのために設置できなかったので、結局がんばって入れたApacheを削除して、nginxに総入れ替えをした。