Nginxの最新安定版がWebSocketのリバースプロキシに対応したそうなので試してみた
タイトルの通りですが,Nginxの最新安定版がWebSocketのリバースプロキシに対応したそうなので(記事),試してみました.
検証環境
- OS: OS X 10.8.3
- プロキシサーバ: Nginx 1.4.0, ポート番号: 3000
- バックエンドサーバ(HTTP, WebSocket): Node 0.8.16, ポート番号: 4567
- ブラウザ: Google Chrome(26.0.1410.65), Safari(6.0.3)
Nginxのインストール
wget http://nginx.org/download/nginx-1.4.0.tar.gz tar xvf nginx-1.4.0.tar.gz cd nginx-1.4.0 ./configure --prefix=ホームディレクトリ/nginx_local make make install
設定ファイルの書き換え
ホームディレクトリ/nginx_local/conf/nginx.confを書き換えます.
http { # ... server { listen 3000; server_name localhost; location / { proxy_pass http://127.0.0.1:4567/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # ... } }
HTTP/1.1では,HTTP通信で確立されているセッションを別のプロトコル(ここだとWebSocketですね)のセッションに再利用するための仕組みとして,Upgradeヘッダーが用意されています(RFC2616を参照).これまでの安定版のNginxは,そのUpgradeヘッダーに対応していなかったためWebSocketのリバースプロキシができませんでした.
試してみよう
Nginxを起動します
sudo ./sbin/nginx
バックエンドのNodeサーバを起動する.使うアプリはよくみかけるSocketIOをつかったアプリです.
socket_io_sample
# socket_io_sampleのディレクトリに移動して node app.js
http://localhost:3000にアクセスしてみましょう.動作していることが確認できます.
掘り下げたいこと
- WebSocketの仕様の変遷
- HTTP1.1のUpdradeヘッダーの仕様