nginxのWebSocketのリバースプロキシはversion 1.3.13から対応。
nginx本体にWebSocketのリバースプロキシが対応したみたいなので、SSL接続まで使ってみました。
nginx.org – WebSocket proxying
http://nginx.org/en/docs/http/websocket.html
バージョンは1.3.13から対応しているようです。stable版ではないので、ソースからコンパイルします。
テストとして、nginxのリバースプロキシ機能を使用して、(http)80,(https)443でlibwebsocketsのテストサーバーに接続してみます。
パッケージダウンロードと展開(2013/03/22時点での最新)
$wget http://nginx.org/download/nginx-1.3.14.tar.gz $tar -zxvf nginx-1.3.14.tar.gz
SSLを有効にしてコンパイル & インストール
$./configure --with-http_ssl_module $make $sudo make install
リバースプロキシを設定してlibwebsocketsのWebSocketサーバーに接続してみる。
ここを参考にして、WebSocketのリバースプロキシを設定します。
※ちなみに、この設定はnginx1.3.13以前のバージョンでも有効な設定であり、WebSocketをクライアントが繋ぎにいこうとするとhttpハンドシェイクがWebSocketサーバー側に伝わります。しかし、この場合はサーバーのみクライアントの接続を認識しますが、クライアント側に応答が返らない状態になります。
◇Port:80 http libwebsocketsのリバースプロキシの設定例。
設定ファイルパス(default):/usr/local/nginx/conf/nginx.conf
libwebsocketsはtest-server/libwebsockets-test-server(同PC内で起動 Port:7681で待受)を使用します。
http{ // 略 server { listen 80; server_name localhost; location / { proxy_pass http://localhost:7681/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } }
libwebsokcets-test-serverの起動
$ ./libwebsockets-test-server lwsts[46535]: libwebsockets test server - (C) Copyright 2010-2013 Andy Green <andy@warmcat.com> - licensed under LGPL2.1 lwsts[46535]: Initial logging level 7 lwsts[46535]: Library version: 1.2 lwsts[46535]: Started with daemon pid 0 lwsts[46535]: static allocation: 5512 + (16 x 1024 fds) = 21896 bytes lwsts[46535]: canonical_hostname = ubuntuserver lwsts[46535]: Compiled with OpenSSL support lwsts[46535]: Using non-SSL mode lwsts[46535]: per-conn mem: 248 + 1328 headers + protocol rx buf lwsts[46535]: Listening on port 7681
nginxの起動
$sudo /usr/local/nginx/sbin/nginx -s stop // 停止 $sudo /usr/local/nginx/sbin/nginx // 起動
ブラウザでアクセスしてみる。
httpで接続!正常に動作します。
libwebsocketsはエイリアスに”/”のみでアクセスし、WebSocketのサブプロトコルが”/”,”dumb-increment-protocol”,”lws-mirror-protocol”で動作が変わります。(nginx.confに”root”パスを書かなくてよいのはlibwebsocketsにhttpサーバーの機能があるからです)。nginxの設定だけでサブプロトコルも引き継ぎられているようです。
アクセスがないソケットはnginxによって閉じられてしまう。
どうやら動きのないソケットはnginxによって閉じられてしまうようです。
“dumb-increment-protocol”はサーバーから一方的にデータ(カウンター値)を受信しているのに対し、”lws-mirror-protocol”は任意のタイミングで送受信が発生するので何もしないと約110秒くらいでソケットが閉じられてしまいます。今のところこのtimeoutの設定はわかりません。
◇Port:443 SSL libwebsocketsのリバースプロキシの設定例。
設定ファイルパス(default):/usr/local/nginx/conf/nginx.conf
libwebsocketsはtest-server/libwebsockets-test-server(同PC内で起動 Port:7681で待受)を使用します。
http{ // 略 server { listen 443; server_name localhost; ssl on; ssl_certificate /home/user/work/libwebsockets/libwebsockets-1.22-chrome26-firefox18/test-server/libwebsockets-test-server.pem; // テストサーバーの証明書 ssl_certificate_key /home/user/work/libwebsockets/libwebsockets-1.22-chrome26-firefox18/test-server/libwebsockets-test-server.key.pem; // テストサーバーの秘密鍵 location /{ proxy_pass https://localhost:7681/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgarede"; } } }
libwebsokcets-test-serverのSSL起動
※configure時に”–enable-openssl”オプションが必要。
$ ./libwebsockets-test-server -ssl lwsts[46628]: libwebsockets test server - (C) Copyright 2010-2013 Andy Green <andy@warmcat.com> - licensed under LGPL2.1 lwsts[46628]: Initial logging level 7 lwsts[46628]: Library version: 1.2 lwsts[46628]: Started with daemon pid 0 lwsts[46628]: static allocation: 5512 + (16 x 1024 fds) = 21896 bytes lwsts[46628]: canonical_hostname = ubuntuserver lwsts[46628]: Compiled with OpenSSL support lwsts[46628]: Using SSL mode lwsts[46628]: per-conn mem: 248 + 1328 headers + protocol rx buf lwsts[46628]: Listening on port 7681
nginxの起動
$sudo /usr/local/nginx/sbin/nginx -s stop // 停止 $sudo /usr/local/nginx/sbin/nginx // 起動
ブラウザでアクセスしてみる。
httpsで接続!!正常に動作します。
ちなみに、動きの無いソケットが閉じられるのはhttpと同じ現象。