node-http-proxyでバーチャルホストで振り分けつつhttp/https->websocketリバースプロキシの実験

以下の2つのページを参考に、node-http-proxyでバーチャルホストで振り分けつつ http/httpsからwebsocketにリバースプロキシする実験をしてみました。 環境はCentOS 6.2です。ソースはhnakamur/node-http-proxy-websocket-sampleにあります。

                              +---------------+
                       +------+ VHost1App/app |
                       |      | port 3000     |
 +--------------+      |      +---------------+
-+ proxy-vhost  +------+
 | port 80, 443 |      |      +---------------+
 +--------------+      +------+ VHost2App/app |
                              | port 3001     |
                              +---------------+

上記の構成で、 vhost1.example.comというホスト名でアクセスしたらVHost1/app、 vhost2.example.comというホスト名でアクセスしたらVHost2/app にリバースプロキシするようにします。 *.example.comというワイルドカードの自己証明書でproxy-vhostにてSSLを処理します。

実行手順

自己証明書とパスフレーズ無しの秘密鍵を生成。

以下、ドメインexample.comの部分は適宜変更してください。

openssl req -new -newkey rsa:2048 -x509 -nodes -days 365 -set_serial 0 \
  -subj '/C=JP/ST=Kanagawa/L=Yokohama City/CN=*.example.com' \
  -out /etc/pki/tls/certs/wildcard.example.com.crt \
  -keyout /etc/pki/tls/private/wildcard.example.com.key

nodeモジュールインストール

私の環境では/usr/local/node-v0.6.19にnode.jsをインストールしているのでPATHを通してから実行します。

export PATH=/usr/local/node-v0.6.19/bin:$PATH
npm install socket.io -g
npm install express@2.5.10 -g
npm install ejs -g
npm install http-proxy -g

なお、モジュールをグルーバルにインストールしているのはhnakamur/node-http-proxy-websocket-sampleにモジュールを含めたくないからで、実際はローカルにインストールしても構いません。

サーバ起動

私の環境では/usr/local/node-v0.6.19にnode.jsをインストールしているのでNODE_PATHを通してから実行します。

export NODE_PATH=/usr/local/node-v0.6.19/lib/node_modules
node VHost1App/app &
node VHost2App/app &
node proxy-vhost &

ローカルマシンの/etc/hostsに以下のエントリ追加

IPアドレスは実際のサーバに合わせて変更してください。

192.0.2.2 vhost1.example.com vhost2.example.com

ブラウザでアクセス

https://vhost1.example.com/https://vhost2.example.com/ にアクセスします。自己証明書なのでエラーになりますが受け入れて進んでください。 バーチャルホスト毎にそれぞれ内容が異なることを確認します。