Socket.io を使用した Laravel Echo ブロードキャスト用の NodeJs サーバー。
正しく機能するには以下が必要です。
Laravel を使用したブロードキャストに関する追加情報は、公式ドキュメントで見つけることができます: https://laravel.com/docs/master/broadcasting
次のコマンドを使用して、npm パッケージをグローバルにインストールします。
$ npm install -g laravel-echo-server
プロジェクト ディレクトリで init コマンドを実行します。
$ laravel-echo-server init
cli ツールは、プロジェクトのルート ディレクトリにlaravel-echo-server.jsonファイルをセットアップするのに役立ちます。このファイルは起動時にサーバーによってロードされます。後でこのファイルを編集して、サーバーの構成を管理できます。
Laravel Echo Server は、ブロードキャスト機能を実行するための軽量の http API を公開します。セキュリティ上の理由から、http リファラーからこれらのエンドポイントへのアクセスは、APP ID とキーで認証される必要があります。これは、cli コマンドを使用して生成できます。
$ laravel-echo-server client:add APP_ID
アプリ ID 引数を指定せずにclient:add
実行すると、アプリ ID が生成されます。このコマンドを実行すると、クライアント ID とキーが表示され、 laravel-echo-server.jsonファイルに保存されます。
この例では、アプリ ID とキーの両方が http リクエストで提供されている限り、リクエストは許可されます。
Request Headers
Authorization: Bearer skti68i...
or
http://app.dev:6001/apps/APP_ID/channels?auth_key=skti68i...
laravel-echo-server client:remove APP_ID
を使用してクライアントを削除できます
プロジェクトのルート ディレクトリで、次を実行します。
$ laravel-echo-server start
プロジェクトのルート ディレクトリで、次を実行します。
$ laravel-echo-server stop
laravel-echo-server.jsonファイルにオプションを追加して、サーバーのデフォルト構成を編集します。
タイトル | デフォルト | 説明 |
---|---|---|
apiOriginAllow | {} | CORS 経由で API にアクセスできるようにする構成。例 |
authEndpoint | /broadcasting/auth | プライベートチャネルを認証するルート |
authHost | http://localhost | プライベート チャネルとプレゼンス チャネルを認証するサーバーのホスト |
database | redis | プレゼンス チャネル メンバーなど、永続化する必要があるデータを保存するために使用されるデータベース。現在のオプションはredis とsqlite です |
databaseConfig | {} | さまざまなデータベースドライバーの構成の例 |
devMode | false | 開発目的で追加のログを追加します |
host | null | 例:socket.io サーバーのホスト。 app.dev 。 null 任意の IP アドレスでの接続を受け入れます |
port | 6001 | Socket.io サーバーが実行されるポート |
protocol | http | http またはhttps のいずれかである必要があります |
sslCertPath | '' | サーバーのSSL証明書へのパス |
sslKeyPath | '' | サーバーのSSLキーへのパス |
sslCertChainPath | '' | サーバーのSSL証明書チェーンへのパス |
sslPassphrase | '' | 証明書に使用するパスフレーズ (該当する場合) |
socketio | {} | socket.io インスタンスに渡すオプション (利用可能なオプション) |
subscribers | {"http": true, "redis": true} | サブスクライバを個別に無効にすることができます。利用可能なサブスクライバ: http およびredis |
laravel-echo-server.json ファイルと同じディレクトリに .env ファイルが見つかった場合は、次のオプションをオーバーライドできます。
authHost
: LARAVEL_ECHO_SERVER_AUTH_HOST
注: このオプションは、.env ファイルで設定されている場合、デフォルトとしてLARAVEL_ECHO_SERVER_HOST
オプションに戻ります。host
: LARAVEL_ECHO_SERVER_HOST
port
: LARAVEL_ECHO_SERVER_PORT
devMode
: LARAVEL_ECHO_SERVER_DEBUG
databaseConfig.redis.host
: LARAVEL_ECHO_SERVER_REDIS_HOST
databaseConfig.redis.port
: LARAVEL_ECHO_SERVER_REDIS_PORT
databaseConfig.redis.password
: LARAVEL_ECHO_SERVER_REDIS_PASSWORD
protocol
: LARAVEL_ECHO_SERVER_PROTO
sslKeyPath
: LARAVEL_ECHO_SERVER_SSL_KEY
sslCertPath
: LARAVEL_ECHO_SERVER_SSL_CERT
sslPassphrase
: LARAVEL_ECHO_SERVER_SSL_PASS
sslCertChainPath
: LARAVEL_ECHO_SERVER_SSL_CHAIN
注: このライブラリは現在、http または https からの提供のみをサポートしており、両方からの提供はサポートしていません。
このパッケージで SSL を実装するのに苦労している場合は、Apache または NginX 内でプロキシ モジュールを使用することを検討してください。基本的に、WebSocket トラフィックを https://yourserver.dev:6001/socket.io?.... に接続してセキュリティを確保しようとする代わりに、WebSocket トラフィックを https://yourserver.dev/socket に接続できます。 .io。バックグラウンドでは、Apache または NginX のプロキシ モジュールが、/socket.io へのリクエストをインターセプトし、ポート 6001 の非 SSL 経由でエコー サーバーに内部的にリダイレクトするように構成されます。これにより、ブラウザと Web の間のすべてのトラフィックが暗号化されます。 Web サーバーは依然として SSL 暗号化/復号化を実行するためです。唯一保護されていないのは、Web サーバーと Echo サーバー間のトラフィックであり、多くの場合、これは許容される可能性があります。
#the following would go within the server{} block of your web server config
location /socket.io {
proxy_pass http://laravel-echo-server:6001; #could be localhost if Echo and NginX are on the same box
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:6001/$1 [P,L]
ProxyPass /socket.io http://localhost:6001/socket.io
ProxyPassReverse /socket.io http://localhost:6001/socket.io
laravel-echo-server
が構成ファイルlaravel-echo-server.json
を検索する作業ディレクトリは、次のように--dir
パラメータを通じてstart
コマンドに渡すことができます: laravel-echo-server start --dir=/var/www/html/example.com/configuration
Laravel Echo Server は、Redis と Http の 2 つの方法で受信イベントをサブスクライブします。
コア アプリケーションは Redis を使用してイベントをチャネルに公開できます。 Laravel Echo サーバーはそれらのチャネルをサブスクライブし、socket.io 経由でそれらのメッセージをブロードキャストします。
Http を使用すると、Redis の場合と同じ方法でchannel
とmessage
ブロードキャスト エンドポイントに送信することにより、Laravel Echo Server にイベントを発行することもできます。 「API クライアント」セクションの説明に従って API キーを生成し、正しい API キーを指定する必要があります。
リクエストエンドポイント
POST http://app.dev:6001/apps/your-app-id/events?auth_key=skti68i...
リクエストボディ
{
"channel" : " channel-name " ,
"name" : " event-name " ,
"data" : {
"key" : " value "
},
"socket_id" : " h3nAdb134tbvqwrg "
}
チャネル- イベントをブロードキャストするチャネルの名前。プライベート チャネルまたはプレゼンス チャネルの場合は、 private-
またはpresence-
先頭に追加します。チャネル- 単一チャネルの代わりに、1 つのリクエストで一連のチャネルにブロードキャストできます。 name - アプリ内のイベント キーを表す文字列。 data - チャンネルにブロードキャストするデータ。 socket_id (オプション) - イベントを開始したユーザーのソケット ID。存在する場合、サーバーは「他のユーザーにブロードキャスト」するだけです。
HTTP サブスクライバは、Laravel Pusher サブスクライバと互換性があります。 Socket.IO サーバーのホストとポートを構成し、config/broadcasting.php でアプリ ID とキーを設定するだけです。シークレットは必要ありません。
' pusher ' => [
' driver ' => ' pusher ' ,
' key ' => env ( ' PUSHER_KEY ' ),
' secret ' => null ,
' app_id ' => env ( ' PUSHER_APP_ID ' ),
' options ' => [
' host ' => ' localhost ' ,
' port ' => 6001 ,
' scheme ' => ' http '
],
],
Redis を使用せずに、HTTP を使用してイベントを送信できるようになりました。これにより、Pusher PHP ライブラリで説明されているように、Pusher API を使用してチャネル/ユーザーをリストすることもできます。
HTTP API は、実行中のサーバーとチャネルに関する情報を収集できるエンドポイントを公開します。
ステータスクライアントの総数、サーバーの稼働時間、メモリ使用量を取得します。
GET /apps/:APP_ID/status
チャンネルすべてのチャンネルのリスト。
GET /apps/:APP_ID/channels
チャンネル特定のチャンネルに関する情報を取得します。
GET /apps/:APP_ID/channels/:CHANNEL_NAME
チャネル ユーザーチャネル上のユーザーのリスト。
GET /apps/:APP_ID/channels/:CHANNEL_NAME/users
apiOriginAllow
のallowCors
true
に変更することで、laravel-echo-server.json ファイルでクロスドメインアクセスを指定できます。次に、CORS Access-Control-Allow-Origin、Access-Control-Allow-Methods をカンマ区切りの文字列として設定し (GET と POST はデフォルトで有効になります)、API が受信できる Access-Control-Allow-Headers を設定できます。
以下の例:
{
"apiOriginAllow" :{
"allowCors" : true ,
"allowOrigin" : " http://127.0.0.1 " ,
"allowMethods" : " GET, POST " ,
"allowHeaders" : " Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id "
}
}
これにより、同じドメインで別のポートまたはまったく別のドメインで実行されているアプリから AJAX 経由で API にリクエストを送信できるようになります。
プレゼンス チャネル データを永続化するために、キー/値ストアとして Redis または SQLite の使用がサポートされています。キーはチャネル名、値はプレゼンス チャネル メンバーのリストです。
各データベースドライバーは、 databaseConfig
プロパティの下のlaravel-echo-server.jsonファイルで構成できます。オプションはデータベース プロバイダーに渡されるため、開発者は必要に応じてこれらを自由に設定できます。
たとえば、カスタム構成を Redis に渡したい場合は、次のようにします。
{
"databaseConfig" : {
"redis" : {
"port" : " 3001 " ,
"host" : " redis.app.dev " ,
"keyPrefix" : " my-redis-prefix "
}
}
}
注: ホスト アドレスにはスキーム (http/https など) を使用しないでください。
Redis オプションの完全なリストはここにあります。
たとえば、redis-sentinel を使用したい場合は、カスタム構成を渡す必要があります。
"databaseConfig" : {
"redis" : {
"sentinels" : [
{
"host" : " redis-sentinel-0 " ,
"port" : 26379
},
{
"host" : " redis-sentinel-1 " ,
"port" : 26379
}
{
"host" : " redis-sentinel-2 " ,
"port" : 26379
}
],
"name" : " mymaster " ,
"sentinelPassword" : " redis-password "
},
},
Redis Sentinel 構成の詳細については、これを確認してください。
SQLite では、データベースが保存されているパスを変更したい場合があります。
{
"databaseConfig" : {
"sqlite" : {
"databasePath" : " /path/to/laravel-echo-server.sqlite "
}
}
}
注 1:このパスは、システムではなく、アプリケーションのルートに対する相対パスです。
注 2:このデータベースには、node-sqlite3 が必要です。ご使用前にインストールしてください。
npm install sqlite3 -g
ユーザーがプレゼンス チャネルに参加すると、プレゼンス チャネル認証データは Redis を使用して保存されます。
プレゼンス チャネルにはユーザーのリストが含まれていますが、ユーザーがプレゼンス チャネルに複数回参加する場合があります。たとえば、これは複数のブラウザ タブを開いたときに発生します。この状況では、「参加」イベントと「退出」イベントは、ユーザーの最初と最後のインスタンスにのみ発行されます。
オプションで、 databaseConfig.publishPresence
をtrue
に設定することで、更新ごとにイベントをプレゼンス チャネルに公開するように laravel-echo-server を構成できます。
{
"database" : " redis " ,
"databaseConfig" : {
"redis" : {
"port" : " 6379 " ,
"host" : " localhost "
},
"publishPresence" : true
}
}
Laravel の Redis 統合を使用して、そこからアプリケーション コードをトリガーできます。
Redis :: subscribe ([ ' PresenceChannelUpdated ' ], function ( $ message ) {
var_dump ( $ message );
});
詳細については、Laravel の公式ドキュメントを参照してください。 https://laravel.com/docs/master/broadcasting#introduction
実行中のサーバーからsocket.ioクライアントライブラリを含めることができます。たとえば、サーバーがapp.dev:6001
で実行されている場合、次のように HTML に script タグを追加できるはずです。
<script src="//app.dev:6001/socket.io/socket.io.js"></script>
注: 実行中のサーバーからソケット.io クライアント ライブラリを使用する場合は、イベントをサブスクライブする前にio
グローバル変数が定義されていることを必ず確認してください。
μWebSockets は正式に非推奨になりました。現在、Socket.IO では µWebSockets はサポートされていませんが、新しい ClusterWS サポートが提供される可能性があります。一方、Laravel Echo Serverは、別のオプションが存在するまでデフォルトでws
エンジンを使用します。