Laravel Reverb
簡介
Laravel Reverb 為您的 Laravel 應用程式直接帶來閃電般快速且可擴展的即時 WebSocket 通訊,並與 Laravel 現有的 事件廣播工具 無縫整合。
安裝
您可以使用 install:broadcasting
Artisan 命令安裝 Reverb
php artisan install:broadcasting
設定
在幕後,install:broadcasting
Artisan 命令將執行 reverb:install
命令,該命令將安裝具有合理預設設定選項的 Reverb。如果您想要進行任何設定變更,您可以透過更新 Reverb 的環境變數或更新 config/reverb.php
設定檔來進行。
應用程式憑證
為了建立與 Reverb 的連線,必須在客戶端和伺服器之間交換一組 Reverb「應用程式」憑證。這些憑證在伺服器上設定,並用於驗證來自客戶端的請求。您可以使用以下環境變數定義這些憑證
REVERB_APP_ID=my-app-idREVERB_APP_KEY=my-app-keyREVERB_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 連線由上游 Web 伺服器 (Nginx 等) 處理,然後請求會被代理到您的 Reverb 伺服器。
但是,有時讓 Reverb 伺服器直接處理安全連線可能很有用,例如在本地開發期間。如果您使用 Laravel Herd 的安全網站功能,或者您正在使用 Laravel Valet 並已對您的應用程式執行了 安全命令,則可以使用為您的網站生成的 Herd / Valet 憑證來保護您的 Reverb 連線。若要執行此操作,請將 REVERB_HOST
環境變數設定為您網站的主機名稱,或在啟動 Reverb 伺服器時明確傳遞主機名稱選項
php artisan reverb:start --host="0.0.0.0" --port=8080 --hostname="laravel.test"
由於 Herd 和 Valet 網域會解析為 localhost
,因此執行上述命令將使您的 Reverb 伺服器可透過安全 WebSocket 協定 (wss
) 在 wss://laravel.test:8080
上存取。
您也可以透過在應用程式的 config/reverb.php
設定檔中定義 tls
選項來手動選擇憑證。在 tls
選項的陣列中,您可以提供 PHP SSL 環境選項支援的任何選項
'options' => [ 'tls' => [ 'local_cert' => '/path/to/cert.pem' ],],
執行伺服器
可以使用 reverb:start
Artisan 命令啟動 Reverb 伺服器
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 將廣播訊息傳送到何處。例如,在生產環境中,您可以將來自連接埠 443
上公用 Reverb 主機名稱的請求路由到在 0.0.0.0:8080
上運行的 Reverb 伺服器。在這種情況下,您的環境變數將定義如下
REVERB_SERVER_HOST=0.0.0.0REVERB_SERVER_PORT=8080 REVERB_HOST=ws.laravel.comREVERB_PORT=443
除錯
為了提高效能,Reverb 預設不會輸出任何除錯資訊。如果您想要查看通過 Reverb 伺服器的資料流,您可以向 reverb:start
命令提供 --debug
選項
php artisan reverb:start --debug
重新啟動
由於 Reverb 是長時間運行的程序,因此如果不透過 reverb:restart
Artisan 命令重新啟動伺服器,您程式碼的變更將不會反映出來。
reverb:restart
命令確保在停止伺服器之前正常終止所有連線。如果您正在使用諸如 Supervisor 之類的程序管理器運行 Reverb,則在終止所有連線後,程序管理器將自動重新啟動伺服器
php artisan reverb:restart
監控
可以透過與 Laravel Pulse 的整合來監控 Reverb。透過啟用 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.confforge soft nofile 10000forge hard nofile 10000
事件迴圈
在底層,Reverb 使用 ReactPHP 事件迴圈來管理伺服器上的 WebSocket 連線。預設情況下,此事件迴圈由 stream_select
提供支援,它不需要任何額外的擴充功能。然而,stream_select
通常限制為 1,024 個開啟的檔案。因此,如果您計劃處理超過 1,000 個並行連線,您需要使用不受相同限制約束的替代事件迴圈。
當 ext-uv
支援的迴圈可用時,Reverb 會自動切換到該迴圈。此 PHP 擴充功能可透過 PECL 安裝。
pecl install uv
Web 伺服器
在大多數情況下,Reverb 會在伺服器上的一個非面向網路的連接埠上執行。因此,為了將流量路由到 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,應更新 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 的作業系統通常會限制可以在伺服器上開啟的連接埠數量。您可以透過以下命令查看目前允許的範圍:
cat /proc/sys/net/ipv4/ip_local_port_range# 32768 60999
上面的輸出顯示伺服器最多可以處理 28,231 個 (60,999 - 32,768) 連線,因為每個連線都需要一個空閒的連接埠。儘管我們建議進行 水平擴展 以增加允許的連線數量,但您可以透過更新伺服器 /etc/sysctl.conf
設定檔案中允許的連接埠範圍來增加可用開啟連接埠的數量。
程序管理
在大多數情況下,您應該使用諸如 Supervisor 之類的進程管理器來確保 Reverb 伺服器持續執行。如果您使用 Supervisor 來執行 Reverb,則應更新伺服器 supervisor.conf
檔案的 minfds
設定,以確保 Supervisor 能夠開啟處理與 Reverb 伺服器的連線所需的檔案。
[supervisord]...minfds=10000
擴展
如果您需要處理比單一伺服器允許的更多連線,則可以水平擴展您的 Reverb 伺服器。利用 Redis 的發布/訂閱功能,Reverb 能夠跨多個伺服器管理連線。當您的應用程式的其中一個 Reverb 伺服器收到訊息時,該伺服器將使用 Redis 將傳入的訊息發布到所有其他伺服器。
要啟用水平擴展,您應該在應用程式的 .env
設定檔案中將 REVERB_SCALING_ENABLED
環境變數設定為 true
。
REVERB_SCALING_ENABLED=true
接下來,您應該擁有一個專用的中央 Redis 伺服器,所有 Reverb 伺服器都將與其通信。Reverb 將使用為您的應用程式設定的預設 Redis 連線將訊息發布到您的所有 Reverb 伺服器。
一旦您啟用了 Reverb 的擴展選項並設定了 Redis 伺服器,您就可以簡單地在能夠與您的 Redis 伺服器通信的多個伺服器上調用 reverb:start
命令。這些 Reverb 伺服器應放置在負載平衡器後面,該負載平衡器將傳入的請求均勻地分發到各個伺服器。