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にアクセスしてみましょう.動作していることが確認できます.

f:id:kitak:20130427175820p:plain

掘り下げたいこと

  • WebSocketの仕様の変遷
  • HTTP1.1のUpdradeヘッダーの仕様