これが参考になった
nginxを1.3.14にしたらWebSocketがProxyできた
config-com.favorymous.www.conf


おかげで家のMacでRocketIOのcomet/websocketチャットが動いた
http://chat.shookai.org/
サブドメインで判別してアプリにproxyしている。

経緯

ほぼ同時に研究室のサーバーが壊れたり、家のファイルサーバーが壊れたりしたのでMacとか色々環境を再構築することになった。

昔研究室のマシンをセットアップした時はみんなRubyしか使ってなかったので、Apache+Passengerにしておいたけど
最近はNodeとかWebSocketとかアプリプロセス内に小さなworker持ったりとかするようになって、Apache+Passengerでは無理になったので

nginxを前に置いて、後ろのアプリ(たくさん、ユーザー権限で動く)にproxyする事にした。
(アプリはforemanなどでlaunchdにインストールする)


インストール

brew info nginx
brew install nginx --devel
develなら、変なことしなくてもwebsocket proxyが使える1.3.14がインストールできる。


起動
nginx
http://localhost:8080 で起動している事を確認。
root権限でないと80番では起動できない。

終了
nginx -s stop

launchd 起動ファイルをコピー
サービスとしてlaunchdにインストール
cp /usr/local/Cellar/nginx/1.3.14/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist

アンインストール
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
brew uninstall nginx


設定する

設定ファイルはここにある
/usr/local/etc/nginx/nginx.conf

編集して、有効にするにはnginxを再起動しなければならないが
設定のシンタックスだけチェックもできる。エラーメッセージもわかりやすい。
nginx -t


nginxからwebsocket使ってるアプリにproxy


まずSinatra RocketIOで作ったwebsocketアプリでチャットするアプリを、HTTP port 5000 / websocket port 33100で動かしてある。
これ shokai/rocketio-chat-sample · GitHub


nginx.confのhttp{ }の中にupstreamとserverを書く
chat.shokai.org へのアクセスを http://127.0.0.1:5000 に流す。
  upstream rocketio-chat {
server 127.0.0.1:5000;
}

server {
listen 8080;
charset utf-8;
server_name chat.shookai.org;
root /Users/sho/projects/rocketio/rocketio-chat-sample/public;
location / {
try_files $uri $uri/index.html $uri.html @rocketio-chat;
}
location @rocketio-chat{
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Document-Root $document_root;
proxy_set_header X-Document-URI $document_uri;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://rocketio-chat;
}
}

nginx再起動すると、cometもwebsocketも通っていた。


設定はgithubで管理することにした
shokai/shookai.org.nginx.conf · GitHub


最終的に、 /usr/local/etc/nginx/apps/アプリ名.conf を作ればどんどん増やせるようにした。
これをテンプレとする。
upstream rocketio-chat {
server 127.0.0.1:5000;
}

server {
listen 8080;
charset utf-8;
server_name chat.shookai.org;
root /Users/sho/projects/rocketio/rocketio-chat-sample/public;
location / {
try_files $uri $uri/index.html $uri.html @rocketio-chat;
}
location @rocketio-chat{
include includes/proxy.conf;
proxy_pass http://rocketio-chat;
}
}