sails.config.sockets
これらの設定オプションは、Sailsによってカプセル化されたWebSocket/PubSubサーバーであるSocket.IOへの透過的なアクセスを提供します。
プロパティ | 型 | デフォルト | 詳細 |
---|---|---|---|
adapter |
'memory' |
メッセージの配信にSocket.IOが使用するキューです。'memory' または'@sailshq/socket.io-redis' のいずれかに設定できます。'@sailshq/socket.io-redis' を指定する場合は、アプリの依存関係に@sailshq/socket.io-redis が含まれていることを確認する必要があります。 |
|
transports |
['websocket'] |
Sails/Socket.IOがクライアント接続時に使用する許可されたトランスポート戦略の配列です。これは、ソケットクライアント(つまり、sails.io.js )の設定と常に一致する必要があります。ここでトランスポートを変更する場合は、そこで設定する必要があり、その逆も同様です。デフォルトのトランスポートを変更することを選択した場合、本番環境で追加の設定が必要になる場合があります。(たとえば、 polling トランスポートを追加し、アプリがNginxなどのロードバランサーの背後にある複数のサーバーで実行されている場合、そのロードバランサーでTCPスティッキーセッションをサポートするように設定する必要があります。ただし、websocket トランスポートのみが有効になっている場合、すぐにその必要はありません。)詳細とベストプラクティスについては、デプロイメント>スケーリングを参照してください。 |
|
onlyAllowOrigins |
undefined |
ソケットの接続を許可するホスト(http:// またはhttps:// で始まる)の配列です。デフォルトでは(つまり、これがundefined である間)、Sails/Socket.IOは、あらゆるオリジンからのソケット接続を許可します。これはテストに役立ちます。しかし、Sails v1.0以降の本番モードでは、フレームワークは、クロスサイトWebSocketハイジャック(CSWSH)攻撃を防ぐために、このオプションを設定することを強制します。そのため、config/env/production.jsまたは環境変数を使用して、この設定を設定する従来の方法があります。たとえば、テスト中に本番モードで実行されているローカルのNode.js/Sails.jsサーバーからWebページを提供する予定がある場合、おそらくこの配列にhttp://localhost:1337 を追加する必要があります。名前が示すように(同様のCORS設定とは対照的に)、リストされているオリジンのみが接続を許可されます。また、接続するソケットがアップグレード要求に「origin」ヘッダーを宣言しない場合(ネイティブiOSアプリ、コマンドラインスクリプト、カスタムハードウェアなどのブラウザ以外の環境)、この設定は無視されます。Electron、Ionic、React Native、Cordova/PhoneGapなどの疑似ブラウザ開発プラットフォームを使用している場合は、ツールが初期ソケット接続要求にどのような(もしあれば)「origin」ヘッダーを付けているかを判断する必要があります。たとえば、Ionic、Cordova、PhoneGapはすべて file:// をオリジンとして送信します。最後に、独自の カスタム実装でこの動作を完全にオーバーライドする場合は、代わりに beforeConnect 設定を使用することを選択できます。 |
本番環境用にSailsアプリを設定し、複数のサーバーにスケールアウトする予定がある場合は、sails.config.sockets.adapter
を'@sailshq/socket.io-redis'
に設定し、Redisインスタンスを設定してから、次の設定を使用してアプリからそれをポイントします。
プロパティ | 型 | デフォルト | 詳細 |
---|---|---|---|
url |
undefined |
接続するRedisインスタンスの接続URLです。これには、以下の他の設定の1つ以上が含まれる場合があります。たとえば、redis://:[email protected]:1234/5 は、host がmyredishost.com 、port が1234 、pass がmypass 、db が5 であることを示します。一般的に、混乱を避けるために、url または以下の設定の組み合わせのいずれかを使用する必要があります(url 設定は、以下のすべての設定をオーバーライドします)。 |
|
db |
undefined |
Redisインスタンス内で使用するデータベースのインデックスです。指定する場合は、整数である必要があります。(ほとんどのRedis設定では、これは0〜15の数になります。) | |
host |
'127.0.0.1' |
Redisインスタンスのホスト名。 | |
pass |
undefined |
Redisインスタンスのパスワード。 | |
port |
6379 |
Redisインスタンスのポート。 |
これらの設定オプションは、完全なカスタマイズのために、基礎となるSocket.IOサーバー設定への低レベルアクセスを提供します。
プロパティ | 型 | デフォルト | 詳細 |
---|---|---|---|
beforeConnect |
undefined |
新しいクライアント側のソケットがサーバーへの接続を試行するたびに実行される関数で、着信接続を拒否または許可するために使用できます。DoS攻撃を防ぐため、またはビジネス固有のヒューリスティックに基づいてSocket.IO接続を拒否するために、本番環境を調整するのに役立ちます。詳細については、下記のbeforeConnectを参照してください。 | |
afterDisconnect |
undefined |
クライアント側のソケットがサーバーから切断されたときに実行する関数です。独自の カスタムロジックを定義するには、afterDisconnect: function (session, socket, cb) {} のような関数を指定します。 |
|
allowUpgrades |
true |
これは、Engine.ioから公開される生の設定オプションです。これは、Socket.ioクライアントが使用しているトランスポートのアップグレードを許可するかどうかを示します(例:ポーリングで開始し、真のWebSocket接続にアップグレードする)。 | |
cookie |
false |
これは、Engine.ioから公開される生の設定オプションです。これは、接続するSocket.IOクライアントのソケットIDを含むHTTP Cookieの名前を示します。Cookieは、最初のSocket.IO「ハンドシェイク」に応答するときに設定されます。または、Cookieを完全に無効にするためにfalse に設定することもできます。sails.io.js クライアントはこのCookieに依存しないため、セキュリティ強化のためにデフォルトで無効(false に設定)になっています。Socket.IOを直接使用していてこのCookieを再度有効にする必要がある場合は、従来の設定は"io" であることに注意してください。 |
|
grant3rdPartyCookie |
true |
HTTP専用セッションCookieを設定するGET /__getcookie ルートを公開するかどうか。デフォルトでは、クロスオリジンサーバーに接続しようとしていることを検出すると、Sailsソケットクライアント(sails.io.js )は、接続を開始する前に、このエンドポイントにCORS+JSONPリクエストを送信します。サードパーティCookieが可能なユーザーエージェントの場合、これにより、sails.io.js は、ユーザーが既に持っているセッションCookie(たとえば、既にログインしている場合)を使用して、ソケットをクロスオリジンSailsサーバーに接続できます。これがないと、ソケットから行う仮想リクエストは同じセッションにアクセスできず、他のメカニズムを使用して再認証する必要があります。 |
|
maxHttpBufferSize |
10E7 |
これは、Engine.ioから公開される生の設定オプションです。これは、ポーリング時のメッセージのバイト数または文字数の最大数を反映し、ソケットを自動的に閉じます(DoSを回避するため)。 | |
path |
/socket.io |
クライアント側のソケットがサーバーに接続するパスです。https://socketio.dokyumento.jp/docs/server-api/#server(opts:object)を参照してください。 | |
pingInterval |
25000 |
これは、Engine.ioから公開される生の設定オプションです。「pingパケット」の間隔(これは「ハートビート」になったものです)をミリ秒単位で反映します。 | |
pingTimeout |
60000 |
これは、Engine.ioから公開される生の設定オプションです。pongパケットがない状態で、Socket.IO接続が閉じていると見なすまでのミリ秒数を反映します。 | |
sendResponseHeaders |
true |
各ソケットリクエスト(例:ブラウザのio.socket.get() )に対して生成されたJWR(JSON WebSocket Response)にレスポンスヘッダーを含めるかどうか。リクエストインタープリターを介してSailsと通信する場合(例:sails.io.jsブラウザSDKで通常の呼び出しを行う場合)を除き、直接的なSocket.IOの使用には影響しません。これは、高トラフィックアプリを調整するときに、パフォーマンスを向上させるために役立ちます。総帯域幅の使用量が削減されるためです。ただし、Sails v0.10以降、レスポンスヘッダーは可能な限りトリミングされるため、非常に大規模なアプリケーションでも、このオプションを使用する必要はほとんどありません。 |
|
serveClient |
false |
/socket.io/socket.io.js でデフォルトのSocket.IOクライアントを提供するかどうか。高度なデバッグに時々役立ちます。 |
|
onRedisDisconnect |
undefined |
Redis接続が切断された場合にSailsが呼び出すオプションの関数です。サイトを一時的なメンテナンスモードまたは「パニックモード」にするのに役立ちます(例については、sails-hook-panic-modeを参照してください)。 | |
onRedisReconnect |
undefined |
以前に切断されたRedis接続が復元された場合にSailsが呼び出すオプションの関数です(上記のonDisconnect を参照)。 |
注:
onRedisDisconnect
とonRedisReconnect
は、Sailsによって作成されたRedisクライアントに対してのみ呼び出されます。独自のRedisクライアントを提供する場合(下記参照)、切断または再接続の場合、これらの関数は自動的には呼び出されません。
beforeConnect
開発中は、ソケットが接続を試行すると、Sailsは常にそれを許可します(HTTPリクエストがルートに到達することを許可するのと同じ方法です)。次に、本番環境では、onlyAllowOrigins
配列により、ホワイトリスト上の基本URLから発信された着信ソケット接続のみがアプリへの接続を許可されます。
アプリでより柔軟性が必要な場合は、追加の予防措置として、ソケット接続を許可または拒否する独自の カスタムロジックを定義できます。そのためには、beforeConnect
関数を指定します。
beforeConnect: function(handshake, proceed) {
// Send back `true` to allow the socket to connect.
// (Or send back `false` to reject the attempt.)
return proceed(undefined, true);
},
beforeConnect
を使用する場合は、onlyAllowOrigins
設定が無視されます。これにより、origin
ヘッダーを設定しない可能性のある非従来のクライアント(たとえば、Electronアプリ内)からのソケット接続を受け入れることができます。
クライアントソケットがSailsアプリに接続すると、デフォルトではセッションCookieを使用して認証されます(セッションフックが有効になっている場合)。これにより、通常のHTTPリクエストと同様に、ソケットから行われた仮想リクエストを既存のユーザーセッションに関連付けることができます。
ブラウザクライアントに関する注記:ユーザーのセッションCookieは、クライアント側のJavaScriptからアクセスできません(そして、決してアクセスできません)。HTTP専用Cookieを使用することは、アプリのセキュリティにとって非常に重要です。
sails.io.jsクライアントは通常、HTTP経由で既にフェッチされたHTMLページから開始されるため、この種のブラウザ環境から接続するソケットは通常、有効なセッションCookieを自動的に提供します。その結果、すべてが正常に動作し、req.session
が使用可能になります。
ただし、クロスオリジンのソケットの場合、Cookieなしで接続アップグレードリクエストを受信することが可能です(特定のトランスポートの場合)。この場合、それらをセッションにリンクする識別情報がないため、仮想リクエスト間で要求元のユーザーを追跡する方法がありません。sails.io.jsクライアントは、最初にCORS+JSONPエンドポイントにHTTPリクエストを送信することでこれを解決し、サードパーティCookieを取得します。このCookieは、ソケット接続を開くときに使用されます。
同様に、ソケットがセッションCookieを提供せずに接続するか、破損したCookieを提供する場合、そのために一時的な使い捨てのセッションエントリが作成されます。提供されたセッションCookieが既知のセッションエントリと一致しない場合も同じことが起こります。
ソケットを接続するときのURLで?cookie
クエリパラメーターの形式でセッションCookieのオーバーライドを渡すようにsails.io.jsを設定することもできます。Sailsは、初期接続アップグレードリクエストで送信された可能性のある実際のセッションCookieの代わりにこれを使用します。たとえば、スタンドアロンのElectronアプリを構築していて、autoConnect
を無効にしてソケットを手動で接続する場合、次のようにします。
var hotSocket = io.sails.connect('http://localhost:1337?cookie=smokeybear');
デフォルトでは、Sailsは@sailshq/socket.io-redis
アダプターを使用する場合、バックグラウンドで新しいRedisクライアントを作成します。場合によっては、PubSub用に独自のRedisクライアント(通常はnode-redisまたはioredisモジュールを使用)を作成し、PubSubで使用するためにSailsに提供する必要がある場合があります。Redis Sentinelの設定を使用する場合(ioredisのようなモジュールを使用してクライアントが接続する必要があるため)、これはよく発生します。次の高度な構成オプションを使用すると、既に接続されているRedisクライアントと関連する構成情報をSailsに渡すことができます。
プロパティ | 型 | デフォルト | 詳細 |
---|---|---|---|
pubClient |
undefined |
Socket.IOで使用されるチャネルへのパブリッシングに使用されるカスタムRedisクライアント。指定しない場合、Sailsがクライアントを作成します。 | |
subClient |
undefined |
Socket.IOで使用されるチャネルへのサブスクリプションに使用されるカスタムRedisクライアント。指定しない場合、Sailsがクライアントを作成します。 | |
adminPubClient |
undefined |
サーバー間の通信を可能にする内部Sails管理バスへのパブリッシングに使用されるカスタムRedisクライアント。pubClient のクライアントを提供する場合は、この設定のクライアントも提供する必要があります。 |
|
adminSubClient |
undefined |
サーバー間の通信を可能にする内部Sails管理バスへのサブスクリプションに使用されるカスタムRedisクライアント。subClient のクライアントを提供する場合は、この設定のクライアントも提供する必要があります。 |
|
subEvent |
message |
サブスクライブするRedisクライアントのイベント名。ioredis で作成されたクライアントを使用する場合は、これをmessageBuffer に設定する必要があります。 |
- 古いバージョンのSails(<v0.11)とSocket.IO(<v1.0)では、
beforeConnect
設定はauthorization
と呼ばれていました。