NginxによるWebSocketの負荷分散
Node.js、Socket.IOを使ってリアルタイムなWebアプリなんかを作っていて、分散構成はどうすればいいのか試行錯誤しているメモ。
Nginxは1.3.13からWebSocketのプロキシに対応したので以下を参考にサクッとやってみる。 http://nginx.org/en/docs/http/websocket.html
upstream chatserver { server xxx.xxx.xxx.xxx:3000; server yyy.yyy.yyy.yyy:3000; } server { listen 3000; server_name localhost; location / { proxy_pass http://chatserver; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
この設定でも確かにプロキシされたし、分散もされた。
しかし、接続先のサーバーが頻繁に変わってしまうようで、アプリの挙動がおかしくなった。
なのでセッションごとに同じサーバーに接続する仕組みが必要。
ip_hashだとなんとなくサーバーが偏りそうな気がしたのでstickyを試す。
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
ここを見ているとstickyが標準で入っているっぽいが、実際には入っていないのでNginxをビルドし直してサードパーティモジュールとして組み込む。
(Nginx Plusなら入ってるのかな?)
stickyのダウンロード先、ビルド方法は以下を参照。
https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng
設定はほとんど変わらず、sticky
を追記するだけ。
upstream chatserver { sticky; server xxx.xxx.xxx.xxx:3000; server yyy.yyy.yyy.yyy:3000; }
今のところこれでいけそう。
ちなみに各バージョンは
Nginx : 1.6.0 Node.js : v0.10.28 Socket.IO : 0.9.17
Nodeを分散するとNodeプロセス間でのデータの共有が必要で、それにはRedisのPub/Subがよいらしい。
以上、アリーヴェデルチ!