Configuring Socket.IO

Jxck edited this page Jun 1, 2013 · 84 revisions

Socket.IOの設定

Socket.IOは、Expressのアプリケーションと同じような方法で設定することができます。 configuresetenabledisableが使用できます。

以下のオプションが設定できます。

Server

  • origins (デフォルトは*:*) * Socket.IOのサーバに接続を許可されている接続元。
  • store (デフォルトはMemoryStore) * クライアントの情報保持に使われるstoreのインスタンス。 動作する実装に関しては、MemoryStoreを参照。 MemoryStoreはSocket.IOをシングルプロセスでデプロイするときのみ使用可能。 複数プロセスないし複数のサーバににスケールする場合は、NoSQLサーバであるRedisを内部で用いたRedisStoreを使用可能。

    Example:

var RedisStore = require('socket.io/lib/stores/redis') , redis = require('socket.io/node_modules/redis') , pub = redis.createClient() , sub = redis.createClient() , client = redis.createClient();

io.set('store', new RedisStore({ redisPub : pub , redisSub : sub , redisClient : client }));


<!--
If your Redis server uses a password, you must auth the client objects ahead of time, and you **must** pass in the redis module you used to create those clients as an option to the RedisStore constructor:
-->
もし Redis サーバがパスワードを用いるなら、先にクライアントオブジェクトを認証する必要があります。そして、クライアントを生成するのに使用した redis モジュールを **必ず** RedisStore のコンストラクタにオプションとして渡す必要があります。

```javascript
var RedisStore = require('socket.io/lib/stores/redis')
, redis  = require('socket.io/node_modules/redis')
, pub    = redis.createClient()
, sub    = redis.createClient()
, client = redis.createClient();

pub.auth(password, function (err) { if (err) throw err; });
sub.auth(password, function (err) { if (err) throw err; });
client.auth(password, function (err) { if (err) throw err; });

io.set('store', new RedisStore({
redis    : redis
, redisPub : pub
, redisSub : sub
, redisClient : client
}));

createClient(port, hostname, options)

  • logger (デフォルトはLogger) * ログを出力するloggerのインスタンス。 動作する実装に関しては、Loggerを参照。
  • static (デフォルトはStatic) * socket.ioクライアントと依存する静的ファイルを配信するインスタンス。 動作する実装に関しては、Staticを参照。
  • heartbeats (デフォルトはtrue) * Socket.IOのコネクションの状態をチェックするのに、heartbeatsを使うべきか。
  • resource (デフォルトは/socket.io) * Socket.IOがincomingな接続を判断するために使用するURI。 この値は、クライアントとサーバで同じであるべき。
  • transports (デフォルトはwebsocket、 htmlfile、 xhr-polling、 jsonp-polling)
  • 許可されたtransportの配列。flashsocketはデフォルトで無効になっているが、flashsocketを配列に足すことで有効にできる。
  • flashsocket は WebSocket をサポートしている Chrome などのブラウザでは、 transport に明示的に flashsocket を指定しない限り、無効になる予定です。 flashsocket は IE8 や IE9 など WebSocket をネイティブにサポートしなブラウザでテストされています。
  • authorization (デフォルトはfalse) * Socket.IOアクセスのためのグローバル認証。 最初にハンドシェイクがサーバで行われるときに実行される。動作する実装に関しては、 Authorization and handshakingを参照。
  • log level (デフォルトは3)
  • サーバがloggerに出力する詳細のレベル。
  • 0 - error
  • 1 - warn
  • 2 - info
  • 3 - debug
  • log color defaults to true
  • log を logger に吐くときに色をつけるかどうか。
  • close timeout (デフォルトは60秒)
  • クライアントがコネクションを閉じた後から、再度コネクションを開くまでに許されている、 クライアントに対するタイムアウト。この値は、ハンドシェイクが成功した後に、クライアントに送られる。
  • heartbeat timeout (デフォルトは60秒)
  • クライアントがサーバにheart beatを送るまでの、クライアントに対するタイムアウト。 この値は、ハンドシェイクが成功した後に、クライアントに送られる。
  • heartbeat interval (デフォルトは25秒)
  • サーバがクライアントからheartbeatを受け取るべき、サーバに対するタイムアウト。 この値は、heartbeat timeoutの値より小さい値であるべき。
  • polling duration (デフォルトは20秒)
  • HTTP pollの最大の期間。これを過ぎると、コネクションは閉じる。
  • flash policy server (デフォルトはtrue)
  • flashsocketが有効であれば、flash policy serverを有効にする。
  • flash policy port (デフォルトは10843)
  • Socket.IOクライアントが、flashsocketの接続が許可されているかどうかを確かめるために、 デフォルトでポート10843をチェックする。Adobe Flash Playerは通常デフォルトでポート843を使用するが、 Socket.IOではルートポートを避け、別のポートを使用することにしている。
  • destroy buffer size defaults to 10E7
  • HTTP transport で使用。 Socket.IO サーバは、この値まで HTTP のリクエストボディをバッファする。この制限は、 websocket や flashsocket には適用されない。
  • destroy upgrade (デフォルトはtrue)
  • Socket.IO以外のupgradeリクエストを破棄するかどうか。
  • browser client (デフォルトはtrue)
  • Socket.IOが、socket.io.jsやWebSocketMain.swfなどの静的ファイルをホストする必要があるかどうか。
  • browser client cache (デフォルトは true)
  • ファイル配信を高速化するため、生成したSocket.IOのクライアントファイルをプロセスのメモリにキャッシュするかどうか。
  • browser client minification (デフォルトはfalse)
  • Socket.IOが、minifiedされたsocket.io.jsを送信する必要があるかどうか。
  • browser client etag (デフォルトはfalse)
  • Socket.IOが、静的なファイルのリクエストにETagを送る必要があるかどうか。
  • browser client expires (デフォルトは 315360000)

  • Cache-Control: private, x-gzip-ok="", max-age=31536000 を静的ファイルのリクエストヘッダに追加します。ただし、ファイルが /socket.io/socket.io.v0.9.9.js のようにバージョン番号付きでリクエストされたときのみです。

  • browser client gzip (デフォルトは false)

  • 静的ファイルをGZIP圧縮するかどうか。圧縮は一度だけ行われメモリに格納されるため、 gzip用のプロセスを何度も起動する必要はない。

  • browser client handler (デフォルトはfalse)
  • socket.io.js を含めて全ての静的ファイルを配信する必要があるか。
  • match origin protocol (デフォルトは false)
  • socket.ioをproxyの後ろで走らせる場合に使われる事を想定しています。location handshakeにおいて、 originのプロトコルを一致させたい場合はtrueを設定して下さい。 これは、nodeの手前でSSLが終了する事に関する問題を修正し、locationがwsではなくwssだと思うように強制します。
var socket = require('socket.io').listen(80, {
  // options can go here
});

// or you can use the .set method

socket.set(key, value);

The browser client handler function

この関数は二つの引数をとる。

  1. HTTPRequest リクエスとオブジェクト req
  2. HTTPResponse レスポンスオブジェクト res

クライアントハンドラは全てのリクエストをハンドリングする必要があります。 これはキャッシングやエラーハンドリングも含みます。

configure関数を理解する

Socket.IOのconfigure関数は、Expressのそれを真似ています。 productiondevelopment などのNODE_ENV環境変数の値によって、Socket.IOを設定することができます。

configure()がenvironment flag無しに呼ばれた場合、全ての環境で実行されます。 configure関数の中で、 setenabledisableが使用できます。 以下の例では、productionの場合はflashsocketとetagを有効に、 developmentの場合はwebsocketのみを有効にしています。

var io = require('socket.io').listen(80);

io.configure('production', function(){
  io.enable('browser client etag');
  io.set('log level', 1);

  io.set('transports', [
    'websocket'
  , 'flashsocket'
  , 'htmlfile'
  , 'xhr-polling'
  , 'jsonp-polling'
  ]);
});

io.configure('development', function(){
  io.set('transports', ['websocket']);
});

どの様にNODE_ENVをセットするか

次の例は、NODE_ENVを_production_にセットしています。

NODE_ENV=production node app.js

お勧めのプロダクションでの設定

Socket.IOは、開発のプロセスを簡単にするように設定されており、 browser client etagなどがデフォルトでfalseなのはそのためです。 これは、例えば、socket.io.jsのファイルがキャッシュされるのを防ぎます。

次のオプションがプロダクションの環境では勧められています:

io.enable('browser client minification');  // minifiedされたクライアントファイルを送信する
io.enable('browser client etag');          // バージョンによってetagによるキャッシングを有効にする
io.set('log level', 1);                    // ログを減らす

// 全通信方法を有効化(オプションで flashsocket をサポートできます。しかし、ホスティングプロバイダに
// よっては、 80 番か提供されたポート以外でサーバを立てることができない場合がある点に注意して下さい。)
io.set('transports', [
    'websocket'
  , 'flashsocket'
  , 'htmlfile'
  , 'xhr-polling'
  , 'jsonp-polling'
]);

Heroku 他のホスティングサービスのように WebSocket をサポートしてないため、独自の 推奨オプション を提供しています。

もしホスティングプロバイダを使用しており、 flashsocket を利用する際に 80 番や他の提供されたポートのみを使用してサーバを起動したい場合は、 transport option を設定する前に flash policy port-1 をセットして下さい。

var io = require('socket.io').listen(80, {
  'flash policy port': -1
});

io.set('transports', ['websocket', 'flashsocket']);

これは policyfile サーバがインラインのポリシーファイルのみを HTTP サーバに対するリクエストに提供するようになります。 flash player がフォールバックする前にポリシーファイルを探し続けてしまうのを防げるため、初期のコネクション確立の時間に影響します。

Client

  • resource (デフォルトは socket.io)
    • サーバでの設定とはわずかに違います。 / はありません。サーバとのミスマッチを防ぐため、 同じ値である必要があります。
  • connect timeout (デフォルトは 10000 ms)
  • サーバに対して他の通信方法へのフォールバックを試みるまでの時間。 いくつかの通信方法は他よりも長いタイムアウトが必要な場合があります。 低すぎる値の設定はサーバに害を及ぼす場合があります。
  • try multiple transports (デフォルトは true)
  • 接続に失敗し全てのフォールバックを試し終えた後、 使用可能な他の全ての通信方法を試すかどうか。
  • reconnect (デフォルトは true)
  • 接続の失敗やタイムアウトを発見した際、自動的に再接続を実行するかどうか。
  • reconnection delay (デフォルトは 500 ms)
    • 再接続を開始するタイムアウトの初期値。この値は、再接続が試されるたびに値が大きくなるアルゴリズムが適用されている。
  • reconnection limit (デフォルトは Infinity)
    • 再接続までの遅延時間。ミリ秒かInfinityを指定。
  • max reconnection attempts (デフォルトは 10)
    • 切断後、再接続を何回試みるか。 この値の回数指向した後 reconnect_failed イベントが発火する。
  • sync disconnect on unload (デフォルトは false)
  • ブラウザーが unload したとき、disconnectパケットを送信するか。
  • auto connect (デフォルトは true)
  • io.connect() を呼んだとき、自動的にサーバとの接続を有効にするべきか。
  • flash policy port (デフォルトは 10843)
  • もしFlashsocketを有効にするなら、この値がサーバと一致している必要がある。
  • force new connection (デフォルトはfalse)
  • 複数の io.connect() が同一サーバに対しては同じコネクションを用いて接続することを強制するか。
var socket = io.connect('http://server.com', {
  // options here
});
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.