#はじめに
Laravel Reverb は、Laravelアプリケーションに高速でスケーラブルなリアルタイムWebSocket通信を直接提供し、Laravelの既存のイベントブロードキャストツールとシームレスに統合します。
#インストール
Laravel Reverb は PHP 8.2+ と Laravel 10.47+ が必要です。
Composerパッケージマネージャーを使って、LaravelプロジェクトにReverbをインストールできます。
composer require laravel/reverb
パッケージをインストールしたら、Reverbのインストールコマンドを実行して設定ファイルを公開し、必要な環境変数を追加し、アプリケーションでイベントブロードキャストを有効にできます。
php artisan reverb:install
#設定
reverb:install コマンドは、合理的なデフォルト設定でReverbを自動的に構成します。設定を変更したい場合は、環境変数を更新するか、config/reverb.php 設定ファイルを編集してください。
#アプリケーション認証情報
Reverbへの接続を確立するには、クライアントとサーバー間でReverbの「アプリケーション」認証情報を交換する必要があります。これらの認証情報はサーバー側で設定され、クライアントからのリクエストを検証するために使われます。以下の環境変数で認証情報を定義できます。
REVERB_APP_ID=my-app-id
REVERB_APP_KEY=my-app-key
REVERB_APP_SECRET=my-app-secret
#許可されたオリジン
クライアントリクエストの発信元となるオリジンは、config/reverb.php の apps セクション内の allowed_origins 設定値を更新して定義できます。許可されていないオリジンからのリクエストは拒否されます。すべてのオリジンを許可するには * を使います。
'apps' => [
[
'id' => 'my-app-id',
'allowed_origins' => ['laravel.com'],
// ...
]
]
#追加のアプリケーション
通常、ReverbはインストールされたアプリケーションのWebSocketサーバーを提供しますが、単一のReverbインストールで複数のアプリケーションを提供することも可能です。
例えば、単一のLaravelアプリケーションを維持しつつ、Reverbを通じて複数のアプリケーションにWebSocket接続を提供したい場合があります。これは、アプリケーションの config/reverb.php 設定ファイルで複数の apps を定義することで実現できます。
'apps' => [
[
'app_id' => 'my-app-one',
// ...
],
[
'app_id' => 'my-app-two',
// ...
],
],
#SSL
ほとんどの場合、セキュアなWebSocket接続は上流のウェブサーバー(Nginxなど)で処理され、その後リクエストがReverbサーバーにプロキシされます。
ただし、ローカル開発などの場面では、Reverbサーバーが直接セキュア接続を処理することが役立つ場合があります。Laravel Herd のセキュアサイト機能を使っている場合や、Laravel Valet で secureコマンド を実行している場合、Herd / Valetが生成した証明書を使ってReverb接続を保護できます。そのためには、REVERB_HOST 環境変数にサイトのホスト名を設定するか、Reverbサーバー起動時にホスト名オプションを明示的に渡してください。
php artisan reverb:start --host="0.0.0.0" --port=8080 --hostname="laravel.test"
HerdやValetのドメインは localhost に解決されるため、上記のコマンドを実行すると、wss://laravel.test:8080 でReverbサーバーにセキュアWebSocketプロトコル(wss)でアクセスできます。
また、config/reverb.php の tls オプションで証明書を手動で指定することも可能です。tls 配列内には、PHPのSSLコンテキストオプションでサポートされている任意のオプションを指定できます。
'options' => [
'tls' => [
'local_cert' => '/path/to/cert.pem'
],
],
#サーバーの起動
Reverbサーバーは reverb:start Artisanコマンドで起動できます。
php artisan reverb:start
デフォルトでは、Reverbサーバーは 0.0.0.0:8080 で起動し、すべてのネットワークインターフェースからアクセス可能になります。
カスタムのホストやポートを指定したい場合は、サーバー起動時に --host と --port オプションを使えます。
php artisan reverb:start --host=127.0.0.1 --port=9000
または、アプリケーションの .env 設定ファイルに REVERB_SERVER_HOST と REVERB_SERVER_PORT 環境変数を定義しても構いません。
REVERB_SERVER_HOST と REVERB_SERVER_PORT は REVERB_HOST と REVERB_PORT と混同しないでください。前者はReverbサーバー自体の起動ホストとポートを指定し、後者はLaravelがブロードキャストメッセージを送信する先を指示します。例えば本番環境では、公開用Reverbホスト名のポート 443 から 0.0.0.0:8080 で動作するReverbサーバーにリクエストをルーティングすることがあります。この場合、環境変数は以下のように設定します。
REVERB_SERVER_HOST=0.0.0.0
REVERB_SERVER_PORT=8080
REVERB_HOST=ws.laravel.com
REVERB_PORT=443
#デバッグ
パフォーマンス向上のため、Reverbはデフォルトでデバッグ情報を出力しません。Reverbサーバーを通過するデータのストリームを確認したい場合は、reverb:start コマンドに --debug オプションを付けてください。
php artisan reverb:start --debug
#再起動
Reverbは長時間実行されるプロセスなので、コード変更を反映するには reverb:restart Artisanコマンドでサーバーを再起動する必要があります。
reverb:restart コマンドは、すべての接続を正常に切断してからサーバーを停止します。SupervisorなどのプロセスマネージャーでReverbを実行している場合、すべての接続が切断された後にプロセスマネージャーが自動的にサーバーを再起動します。
php artisan reverb:restart
#本番環境でのReverbの実行
WebSocketサーバーは長時間稼働するため、サーバーやホスティング環境を最適化して、利用可能なリソースに対して最適な接続数を効率的に処理できるようにする必要があります。
サイトが Laravel Forge で管理されている場合、「Application」パネルからReverbの最適化を自動で行えます。Reverb統合を有効にすると、Forgeは必要な拡張機能のインストールや接続数の上限増加など、本番環境に適した設定を行います。
#オープンファイル
各WebSocket接続はクライアントまたはサーバーが切断するまでメモリ上に保持されます。Unix系環境では、各接続はファイルとして表現されます。ただし、OSやアプリケーションレベルでオープンファイル数に制限があることが多いです。
#オペレーティングシステム
Unix系OSでは、ulimit コマンドで許可されているオープンファイル数を確認できます。
ulimit -n
このコマンドはユーザーごとのオープンファイル制限を表示します。/etc/security/limits.conf ファイルを編集してこれらの値を更新できます。例えば、forge ユーザーの最大オープンファイル数を10,000に設定する例は以下の通りです。
# /etc/security/limits.conf
forge soft nofile 10000
forge hard nofile 10000
#イベントループ
内部的に、Reverb はサーバー上の WebSocket 接続を管理するために ReactPHP のイベントループを使用します。デフォルトでは、このイベントループは stream_select によって動作し、追加の拡張は必要ありません。しかし、stream_select は通常、開けるファイル数が 1,024 に制限されています。したがって、同時接続が 1,000 を超えるような運用を想定する場合は、同じ制限を受けない別のイベントループを使用する必要があります。
利用可能な場合、Reverbは自動的に ext-event、ext-ev、または ext-uv を使ったイベントループに切り替えます。これらのPHP拡張はPECLからインストール可能です。
pecl install event
# または
pecl install ev
# または
pecl install uv
#ウェブサーバー
ほとんどの場合、Reverbはサーバー上のウェブ非公開ポートで動作します。したがって、Reverbへのトラフィックをルーティングするにはリバースプロキシを設定すべきです。Reverbがホスト 0.0.0.0、ポート 8080 で動作し、サーバーがNginxを使っている場合、以下のNginxサイト設定でリバースプロキシを定義できます。
server {
...
location / {
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://0.0.0.0:8080;
}
...
}
通常、ウェブサーバーは過負荷を防ぐために許可される接続数を制限します。Nginxで許可される接続数を10,000に増やすには、nginx.conf の worker_rlimit_nofile と worker_connections の値を更新してください。
user forge;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
worker_rlimit_nofile 10000;
events {
worker_connections 10000;
multi_accept on;
}
上記の設定により、プロセスごとに最大10,000のNginxワーカーが生成可能になります。また、Nginxのオープンファイル制限も10,000に設定されます。
#ポート
Unix系OSはサーバーで開けるポート数に制限を設けています。現在の許可範囲は以下のコマンドで確認できます。
cat /proc/sys/net/ipv4/ip_local_port_range
# 32768 60999
The output above shows the server can handle a maximum of 28,231 (60,999 - 32,768) connections since each connection requires a free port. Although we recommend horizontal scaling to increase the number of allowed connections, you may increase the number of available open ports by updating the allowed port range in your server's /etc/sysctl.conf configuration file.
#Process Management
In most cases, you should use a process manager such as Supervisor to ensure the Reverb server is continually running. If you are using Supervisor to run Reverb, you should update the minfds setting of your server's supervisor.conf file to ensure Supervisor is able to open the files required to handle connections to your Reverb server:
[supervisord]
...
minfds=10000
#スケーリング
単一サーバーで処理できる接続数を超える場合、Reverbサーバーを水平スケールできます。Redisのパブリッシュ/サブスクライブ機能を利用し、複数サーバー間で接続を管理します。アプリケーションのReverbサーバーの1つがメッセージを受信すると、Redisを使って他のすべてのサーバーにメッセージを配信します。
水平スケーリングを有効にするには、アプリケーションの .env 設定ファイルで REVERB_SCALING_ENABLED 環境変数を true に設定してください。
REVERB_SCALING_ENABLED=true
次に、すべてのReverbサーバーが通信する専用の中央Redisサーバーを用意します。Reverbはアプリケーションで設定されたデフォルトのRedis接続を使ってメッセージをすべてのReverbサーバーに配信します。
Reverbのスケーリングオプションを有効にしRedisサーバーを設定したら、Redisサーバーと通信可能な複数のサーバーで reverb:start コマンドを実行するだけです。これらのReverbサーバーは、リクエストを均等に分散するロードバランサーの背後に配置してください。