はじめに

Laravel Reverbは、Laravelアプリケーションに直接、高速でスケーラブルなリアルタイムWebSocket通信を提供し、Laravelの既存のイベントブロードキャスティングツールとのシームレスな統合を実現します。

インストール

Reverbは、install:broadcasting Artisanコマンドを使用してインストールできます:

  1. php artisan install:broadcasting

設定

裏では、install:broadcasting Artisanコマンドがreverb:installコマンドを実行し、Reverbを適切なデフォルト設定オプションでインストールします。設定を変更したい場合は、Reverbの環境変数を更新するか、config/reverb.php設定ファイルを更新することで行えます。

アプリケーションクレデンシャル

Reverbに接続するためには、クライアントとサーバー間で一連のReverb「アプリケーション」クレデンシャルを交換する必要があります。これらのクレデンシャルはサーバーで設定され、クライアントからのリクエストを検証するために使用されます。次の環境変数を使用してこれらのクレデンシャルを定義できます:

  1. REVERB_APP_ID=my-app-id
  2. REVERB_APP_KEY=my-app-key
  3. REVERB_APP_SECRET=my-app-secret

許可されたオリジン

クライアントリクエストが発信されるオリジンを、allowed_origins設定値をappsセクションのconfig/reverb.php設定ファイル内で更新することで定義できます。許可されたオリジンにリストされていないオリジンからのリクエストは拒否されます。*を使用してすべてのオリジンを許可することもできます:

  1. 'apps' => [
  2. [
  3. 'id' => 'my-app-id',
  4. 'allowed_origins' => ['laravel.com'],
  5. // ...
  6. ]
  7. ]

追加アプリケーション

通常、ReverbはインストールされたアプリケーションのためのWebSocketサーバーを提供します。しかし、単一のReverbインストールを使用して複数のアプリケーションを提供することも可能です。

たとえば、Reverbを介して複数のアプリケーションにWebSocket接続を提供する単一のLaravelアプリケーションを維持したい場合があります。これは、アプリケーションのconfig/reverb.php設定ファイル内で複数のappsを定義することで実現できます:

  1. 'apps' => [
  2. [
  3. 'app_id' => 'my-app-one',
  4. // ...
  5. ],
  6. [
  7. 'app_id' => 'my-app-two',
  8. // ...
  9. ],
  10. ],

SSL

ほとんどの場合、安全なWebSocket接続は、リクエストがReverbサーバーにプロキシされる前に、上流のWebサーバー(Nginxなど)によって処理されます。

ただし、ローカル開発中など、Reverbサーバーが安全な接続を直接処理することが有用な場合もあります。Laravel Herdの安全なサイト機能を使用している場合や、Laravel Valetを使用しており、アプリケーションに対してsecure commandを実行した場合、サイトのために生成されたHerd / Valet証明書を使用してReverb接続を保護できます。そのためには、REVERB_HOST環境変数をサイトのホスト名に設定するか、Reverbサーバーを起動する際にホスト名オプションを明示的に渡します:

  1. php artisan reverb:start --host="0.0.0.0" --port=8080 --hostname="laravel.test"

HerdとValetのドメインはlocalhostに解決されるため、上記のコマンドを実行すると、Reverbサーバーはwss://laravel.test:8080wssの安全なWebSocketプロトコルを介してアクセス可能になります。

また、config/reverb.php設定ファイル内でtlsオプションを定義することで、手動で証明書を選択することもできます。tlsオプションの配列内で、PHPのSSLコンテキストオプションによってサポートされている任意のオプションを提供できます:

  1. 'options' => [
  2. 'tls' => [
  3. 'local_cert' => '/path/to/cert.pem'
  4. ],
  5. ],

サーバーの実行

Reverbサーバーは、reverb:start Artisanコマンドを使用して起動できます:

  1. php artisan reverb:start

デフォルトでは、Reverbサーバーは0.0.0.0:8080で起動し、すべてのネットワークインターフェースからアクセス可能になります。

カスタムホストまたはポートを指定する必要がある場合は、サーバーを起動する際に--hostおよび--portオプションを使用して指定できます:

  1. php artisan reverb:start --host=127.0.0.1 --port=9000

または、アプリケーションの.env設定ファイル内でREVERB_SERVER_HOSTおよびREVERB_SERVER_PORT環境変数を定義できます。

  1. ``````ini
  2. REVERB_SERVER_HOST=0.0.0.0
  3. REVERB_SERVER_PORT=8080
  4. REVERB_HOST=ws.laravel.com
  5. REVERB_PORT=443
  6. `

デバッグ

パフォーマンスを向上させるために、Reverbはデフォルトでデバッグ情報を出力しません。Reverbサーバーを通過するデータのストリームを表示したい場合は、--debugオプションをreverb:startコマンドに提供できます:

  1. php artisan reverb:start --debug

再起動

Reverbは長時間実行されるプロセスであるため、コードの変更はreverb:restart Artisanコマンドを介してサーバーを再起動しない限り反映されません。

  1. ``````sh
  2. php artisan reverb:restart
  3. `

監視

Reverbは、Laravel Pulseとの統合を介して監視できます。ReverbのPulse統合を有効にすることで、サーバーが処理している接続数やメッセージ数を追跡できます。

統合を有効にするには、まずPulseをインストールしていることを確認してください。次に、Reverbのレコーダーのいずれかをアプリケーションのconfig/pulse.php設定ファイルに追加します:

  1. use Laravel\Reverb\Pulse\Recorders\ReverbConnections;
  2. use Laravel\Reverb\Pulse\Recorders\ReverbMessages;
  3. 'recorders' => [
  4. ReverbConnections::class => [
  5. 'sample_rate' => 1,
  6. ],
  7. ReverbMessages::class => [
  8. 'sample_rate' => 1,
  9. ],
  10. ...
  11. ],

次に、各レコーダーのPulseカードをPulseダッシュボードに追加します:

  1. <x-pulse>
  2. <livewire:reverb.connections cols="full" />
  3. <livewire:reverb.messages cols="full" />
  4. ...
  5. </x-pulse>

本番環境でのReverbの実行

WebSocketサーバーの長時間実行の性質により、Reverbサーバーがサーバー上のリソースに対して最適な接続数を効果的に処理できるように、サーバーとホスティング環境にいくつかの最適化を行う必要があります。

サイトがLaravel Forgeによって管理されている場合、「アプリケーション」パネルから直接Reverbのためにサーバーを自動的に最適化できます。Reverb統合を有効にすることで、Forgeはサーバーが本番環境に適した状態になるようにし、必要な拡張機能をインストールし、許可される接続数を増やします。

オープンファイル

各WebSocket接続は、クライアントまたはサーバーが切断されるまでメモリに保持されます。UnixおよびUnix系環境では、各接続はファイルで表されます。ただし、オペレーティングシステムとアプリケーションレベルの両方で、許可されるオープンファイルの数には制限があることがよくあります。

オペレーティングシステム

Unixベースのオペレーティングシステムでは、ulimitコマンドを使用して許可されるオープンファイルの数を確認できます:

  1. ulimit -n

このコマンドは、異なるユーザーに対して許可されるオープンファイルの制限を表示します。これらの値は、/etc/security/limits.confファイルを編集することで更新できます。たとえば、forgeユーザーのオープンファイルの最大数を10,000に更新する場合は、次のようになります:

  1. # /etc/security/limits.conf
  2. forge soft nofile 10000
  3. forge hard nofile 10000

イベントループ

内部では、ReverbはReactPHPイベントループを使用してサーバー上のWebSocket接続を管理します。デフォルトでは、このイベントループはstream_selectによって駆動され、追加の拡張は必要ありません。ただし、stream_selectは通常1,024のオープンファイルに制限されています。そのため、1,000を超える同時接続を処理する予定がある場合は、同じ制限に縛られない代替のイベントループを使用する必要があります。

Reverbは、利用可能な場合、ext-uv駆動のループに自動的に切り替わります。このPHP拡張はPECLを介してインストール可能です:

  1. pecl install uv

Webサーバー

ほとんどの場合、Reverbはサーバー上の非Web向けポートで実行されます。したがって、Reverbにトラフィックをルーティングするには、リバースプロキシを構成する必要があります。Reverbがホスト0.0.0.0およびポート8080で実行されており、サーバーがNginx Webサーバーを利用していると仮定すると、次のNginxサイト構成を使用してReverbサーバーのリバースプロキシを定義できます:

  1. server {
  2. ...
  3. location / {
  4. proxy_http_version 1.1;
  5. proxy_set_header Host $http_host;
  6. proxy_set_header Scheme $scheme;
  7. proxy_set_header SERVER_PORT $server_port;
  8. proxy_set_header REMOTE_ADDR $remote_addr;
  9. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  10. proxy_set_header Upgrade $http_upgrade;
  11. proxy_set_header Connection "Upgrade";
  12. proxy_pass http://0.0.0.0:8080;
  13. }
  14. ...
  15. }

Reverbは/appでWebSocket接続をリッスンし、/appsでAPIリクエストを処理します。Reverbリクエストを処理するWebサーバーがこれらのURIの両方を提供できることを確認してください。Laravel Forgeを使用してサーバーを管理している場合、Reverbサーバーはデフォルトで正しく構成されます。

通常、Webサーバーはサーバーの過負荷を防ぐために許可される接続数を制限するように構成されています。Nginx Webサーバーで許可される接続数を10,000に増やすには、worker_rlimit_nofileおよびworker_connectionsnginx.confファイルの値を更新する必要があります:

  1. user forge;
  2. worker_processes auto;
  3. pid /run/nginx.pid;
  4. include /etc/nginx/modules-enabled/*.conf;
  5. worker_rlimit_nofile 10000;
  6. events {
  7. worker_connections 10000;
  8. multi_accept on;
  9. }

上記の構成により、プロセスごとに最大10,000のNginxワーカーを生成できるようになります。さらに、この構成はNginxのオープンファイル制限を10,000に設定します。

ポート

Unixベースのオペレーティングシステムは、サーバー上で開くことができるポートの数を通常制限します。現在の許可された範囲は、次のコマンドを使用して確認できます:

  1. cat /proc/sys/net/ipv4/ip_local_port_range
  2. # 32768 60999

上記の出力は、各接続が無料のポートを必要とするため、サーバーが最大28,231(60,999 - 32,768)接続を処理できることを示しています。許可される接続数を増やすために水平スケーリングを推奨しますが、サーバーの/etc/sysctl.conf設定ファイルで許可されたポート範囲を更新することで、利用可能なオープンポートの数を増やすことができます。

プロセスマネジメント

ほとんどの場合、Reverbサーバーが継続的に実行されるように、Supervisorなどのプロセスマネージャーを使用する必要があります。Supervisorを使用してReverbを実行している場合、サーバーのsupervisor.confファイルのminfds設定を更新して、SupervisorがReverbサーバーへの接続を処理するために必要なファイルを開けるようにする必要があります:

  1. [supervisord]
  2. ...
  3. minfds=10000

スケーリング

単一のサーバーが許可する接続数を超えて処理する必要がある場合は、Reverbサーバーを水平にスケールすることができます。Redisのパブリッシュ/サブスクライブ機能を利用することで、Reverbは複数のサーバー間で接続を管理できます。アプリケーションのReverbサーバーの1つがメッセージを受信すると、サーバーはRedisを使用して受信メッセージを他のすべてのサーバーに公開します。

水平スケーリングを有効にするには、アプリケーションの.env設定ファイル内でREVERB_SCALING_ENABLED環境変数をtrueに設定する必要があります:

  1. REVERB_SCALING_ENABLED=true

次に、すべてのReverbサーバーが通信するための専用の中央Redisサーバーを用意する必要があります。Reverbは、アプリケーション用に構成されたデフォルトのRedis接続を使用して、すべてのReverbサーバーにメッセージを公開します。

Reverbのスケーリングオプションを有効にし、Redisサーバーを構成したら、Redisサーバーと通信できる複数のサーバーでreverb:startコマンドを単に呼び出すことができます。これらのReverbサーバーは、受信リクエストを均等に分配するロードバランサーの背後に配置する必要があります。