はじめに
Laravel Reverbは、Laravelアプリケーションに直接、高速でスケーラブルなリアルタイムWebSocket通信を提供し、Laravelの既存のイベントブロードキャスティングツールとのシームレスな統合を実現します。
インストール
Reverbは、install:broadcasting
Artisanコマンドを使用してインストールできます:
php artisan install:broadcasting
設定
裏では、install:broadcasting
Artisanコマンドがreverb:install
コマンドを実行し、Reverbを適切なデフォルト設定オプションでインストールします。設定を変更したい場合は、Reverbの環境変数を更新するか、config/reverb.php
設定ファイルを更新することで行えます。
アプリケーションクレデンシャル
Reverbに接続するためには、クライアントとサーバー間で一連のReverb「アプリケーション」クレデンシャルを交換する必要があります。これらのクレデンシャルはサーバーで設定され、クライアントからのリクエストを検証するために使用されます。次の環境変数を使用してこれらのクレデンシャルを定義できます:
REVERB_APP_ID=my-app-id
REVERB_APP_KEY=my-app-key
REVERB_APP_SECRET=my-app-secret
許可されたオリジン
クライアントリクエストが発信されるオリジンを、allowed_origins
設定値をapps
セクションのconfig/reverb.php
設定ファイル内で更新することで定義できます。許可されたオリジンにリストされていないオリジンからのリクエストは拒否されます。*
を使用してすべてのオリジンを許可することもできます:
'apps' => [
[
'id' => 'my-app-id',
'allowed_origins' => ['laravel.com'],
// ...
]
]
追加アプリケーション
通常、ReverbはインストールされたアプリケーションのためのWebSocketサーバーを提供します。しかし、単一のReverbインストールを使用して複数のアプリケーションを提供することも可能です。
たとえば、Reverbを介して複数のアプリケーションにWebSocket接続を提供する単一のLaravelアプリケーションを維持したい場合があります。これは、アプリケーションのconfig/reverb.php
設定ファイル内で複数のapps
を定義することで実現できます:
'apps' => [
[
'app_id' => 'my-app-one',
// ...
],
[
'app_id' => 'my-app-two',
// ...
],
],
SSL
ほとんどの場合、安全なWebSocket接続は、リクエストがReverbサーバーにプロキシされる前に、上流のWebサーバー(Nginxなど)によって処理されます。
ただし、ローカル開発中など、Reverbサーバーが安全な接続を直接処理することが有用な場合もあります。Laravel Herdの安全なサイト機能を使用している場合や、Laravel Valetを使用しており、アプリケーションに対してsecure commandを実行した場合、サイトのために生成されたHerd / Valet証明書を使用してReverb接続を保護できます。そのためには、REVERB_HOST
環境変数をサイトのホスト名に設定するか、Reverbサーバーを起動する際にホスト名オプションを明示的に渡します:
php artisan reverb:start --host="0.0.0.0" --port=8080 --hostname="laravel.test"
HerdとValetのドメインはlocalhost
に解決されるため、上記のコマンドを実行すると、Reverbサーバーはwss://laravel.test:8080
でwss
の安全なWebSocketプロトコルを介してアクセス可能になります。
また、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
環境変数を定義できます。
``````ini
REVERB_SERVER_HOST=0.0.0.0
REVERB_SERVER_PORT=8080
REVERB_HOST=ws.laravel.com
REVERB_PORT=443
`
デバッグ
パフォーマンスを向上させるために、Reverbはデフォルトでデバッグ情報を出力しません。Reverbサーバーを通過するデータのストリームを表示したい場合は、--debug
オプションをreverb:start
コマンドに提供できます:
php artisan reverb:start --debug
再起動
Reverbは長時間実行されるプロセスであるため、コードの変更はreverb:restart
Artisanコマンドを介してサーバーを再起動しない限り反映されません。
``````sh
php artisan reverb:restart
`
監視
Reverbは、Laravel Pulseとの統合を介して監視できます。ReverbのPulse統合を有効にすることで、サーバーが処理している接続数やメッセージ数を追跡できます。
統合を有効にするには、まずPulseをインストールしていることを確認してください。次に、Reverbのレコーダーのいずれかをアプリケーションのconfig/pulse.php
設定ファイルに追加します:
use Laravel\Reverb\Pulse\Recorders\ReverbConnections;
use Laravel\Reverb\Pulse\Recorders\ReverbMessages;
'recorders' => [
ReverbConnections::class => [
'sample_rate' => 1,
],
ReverbMessages::class => [
'sample_rate' => 1,
],
...
],
次に、各レコーダーのPulseカードをPulseダッシュボードに追加します:
<x-pulse>
<livewire:reverb.connections cols="full" />
<livewire:reverb.messages cols="full" />
...
</x-pulse>
本番環境でのReverbの実行
WebSocketサーバーの長時間実行の性質により、Reverbサーバーがサーバー上のリソースに対して最適な接続数を効果的に処理できるように、サーバーとホスティング環境にいくつかの最適化を行う必要があります。
サイトがLaravel Forgeによって管理されている場合、「アプリケーション」パネルから直接Reverbのためにサーバーを自動的に最適化できます。Reverb統合を有効にすることで、Forgeはサーバーが本番環境に適した状態になるようにし、必要な拡張機能をインストールし、許可される接続数を増やします。
オープンファイル
各WebSocket接続は、クライアントまたはサーバーが切断されるまでメモリに保持されます。UnixおよびUnix系環境では、各接続はファイルで表されます。ただし、オペレーティングシステムとアプリケーションレベルの両方で、許可されるオープンファイルの数には制限があることがよくあります。
オペレーティングシステム
Unixベースのオペレーティングシステムでは、ulimit
コマンドを使用して許可されるオープンファイルの数を確認できます:
ulimit -n
このコマンドは、異なるユーザーに対して許可されるオープンファイルの制限を表示します。これらの値は、/etc/security/limits.conf
ファイルを編集することで更新できます。たとえば、forge
ユーザーのオープンファイルの最大数を10,000に更新する場合は、次のようになります:
# /etc/security/limits.conf
forge soft nofile 10000
forge hard nofile 10000
イベントループ
内部では、ReverbはReactPHPイベントループを使用してサーバー上のWebSocket接続を管理します。デフォルトでは、このイベントループはstream_select
によって駆動され、追加の拡張は必要ありません。ただし、stream_select
は通常1,024のオープンファイルに制限されています。そのため、1,000を超える同時接続を処理する予定がある場合は、同じ制限に縛られない代替のイベントループを使用する必要があります。
Reverbは、利用可能な場合、ext-uv
駆動のループに自動的に切り替わります。このPHP拡張はPECLを介してインストール可能です:
pecl install uv
Webサーバー
ほとんどの場合、Reverbはサーバー上の非Web向けポートで実行されます。したがって、Reverbにトラフィックをルーティングするには、リバースプロキシを構成する必要があります。Reverbがホスト0.0.0.0
およびポート8080
で実行されており、サーバーがNginx Webサーバーを利用していると仮定すると、次のNginxサイト構成を使用してReverbサーバーのリバースプロキシを定義できます:
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;
}
...
}
Reverbは/app
でWebSocket接続をリッスンし、/apps
でAPIリクエストを処理します。Reverbリクエストを処理するWebサーバーがこれらのURIの両方を提供できることを確認してください。Laravel Forgeを使用してサーバーを管理している場合、Reverbサーバーはデフォルトで正しく構成されます。
通常、Webサーバーはサーバーの過負荷を防ぐために許可される接続数を制限するように構成されています。Nginx Webサーバーで許可される接続数を10,000に増やすには、worker_rlimit_nofile
およびworker_connections
のnginx.conf
ファイルの値を更新する必要があります:
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ベースのオペレーティングシステムは、サーバー上で開くことができるポートの数を通常制限します。現在の許可された範囲は、次のコマンドを使用して確認できます:
cat /proc/sys/net/ipv4/ip_local_port_range
# 32768 60999
上記の出力は、各接続が無料のポートを必要とするため、サーバーが最大28,231(60,999 - 32,768)接続を処理できることを示しています。許可される接続数を増やすために水平スケーリングを推奨しますが、サーバーの/etc/sysctl.conf
設定ファイルで許可されたポート範囲を更新することで、利用可能なオープンポートの数を増やすことができます。
プロセスマネジメント
ほとんどの場合、Reverbサーバーが継続的に実行されるように、Supervisorなどのプロセスマネージャーを使用する必要があります。Supervisorを使用してReverbを実行している場合、サーバーのsupervisor.conf
ファイルのminfds
設定を更新して、SupervisorがReverbサーバーへの接続を処理するために必要なファイルを開けるようにする必要があります:
[supervisord]
...
minfds=10000
スケーリング
単一のサーバーが許可する接続数を超えて処理する必要がある場合は、Reverbサーバーを水平にスケールすることができます。Redisのパブリッシュ/サブスクライブ機能を利用することで、Reverbは複数のサーバー間で接続を管理できます。アプリケーションのReverbサーバーの1つがメッセージを受信すると、サーバーはRedisを使用して受信メッセージを他のすべてのサーバーに公開します。
水平スケーリングを有効にするには、アプリケーションの.env
設定ファイル内でREVERB_SCALING_ENABLED
環境変数をtrue
に設定する必要があります:
REVERB_SCALING_ENABLED=true
次に、すべてのReverbサーバーが通信するための専用の中央Redisサーバーを用意する必要があります。Reverbは、アプリケーション用に構成されたデフォルトのRedis接続を使用して、すべてのReverbサーバーにメッセージを公開します。
Reverbのスケーリングオプションを有効にし、Redisサーバーを構成したら、Redisサーバーと通信できる複数のサーバーでreverb:start
コマンドを単に呼び出すことができます。これらのReverbサーバーは、受信リクエストを均等に分配するロードバランサーの背後に配置する必要があります。