用於使用 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
如果您執行client:add
不帶 app id 參數,則會為您產生一個。執行此命令後,客戶端 ID 和金鑰將顯示並儲存在laravel-echo-server.json檔案中。
在此範例中,只要 http 請求中同時提供了應用程式 ID 和金鑰,請求就會被允許。
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/socket,而不是將您的websocket 流量連接到https://yourserver.dev:6001/socket.io?.....並嘗試保護它的安全.io。在幕後,Apache 或NginX 的代理模組將配置為攔截/socket.io 的請求,並透過連接埠6001 上的非ssl 在內部將這些請求重定向到您的echo 伺服器。所有流量保持加密伺服器,因為您的 Web 伺服器仍將執行 SSL 加密/解密。唯一不安全的是您的網路伺服器和 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。
您的核心應用程式可以使用 Redis 將事件發佈到通道。 Laravel Echo 伺服器將訂閱這些頻道並透過 socket.io 廣播這些訊息。
使用 Http,您也可以透過向廣播端點提交channel
和message
,以與使用 Redis 相同的方式將事件發佈到 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 '
],
],
現在您可以使用 HTTP 發送事件,而無需使用 Redis。這也允許您使用 Pusher API 列出頻道/用戶,如 Pusher PHP 庫中所述
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
可以在 laravel-echo-server.json 檔案中透過將apiOriginAllow
中的allowCors
更改為true
來指定跨網域存取。然後,您可以將 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 作為鍵/值儲存。鍵是頻道名稱,值是線上狀態頻道成員清單。
每個資料庫驅動程式都可以在laravel-echo-server.json檔案中的databaseConfig
屬性下進行設定。這些選項將傳遞給資料庫供應商,因此開發人員可以根據自己的意願自由設定它們。
例如,如果您想將自訂配置傳遞給 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哨兵配置的更多信息,您可以查看此
使用 SQLite,您可能有興趣更改資料庫的儲存路徑。
{
"databaseConfig" : {
"sqlite" : {
"databasePath" : " /path/to/laravel-echo-server.sqlite "
}
}
}
注意 1:該路徑是相對於應用程式的根目錄的,而不是相對於系統的根目錄。
註2:該資料庫需要node-sqlite3。使用前請先安裝。
npm install sqlite3 -g
當使用者加入線上狀態通道時,他們的線上狀態通道驗證資料將使用 Redis 儲存。
雖然線上狀態頻道包含使用者列表,但有時使用者會多次加入線上狀態頻道。例如,開啟多個瀏覽器標籤時會發生這種情況。在這種情況下,「加入」和「離開」事件僅傳送到使用者的第一個和最後一個實例。
(可選)您可以設定 laravel-echo-server,透過將databaseConfig.publishPresence
設定為true
,在每次更新時發布事件到狀態通道:
{
"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 src="//app.dev:6001/socket.io/socket.io.js"></script>
注意:當從正在執行的伺服器使用 socket.io 用戶端程式庫時,請記住在訂閱事件之前檢查io
全域變數是否已定義。
µWebSockets 已正式被棄用。目前 Socket.IO 中不支援 µWebSockets,但可能會引入新的 ClusterWS 支援。同時 Laravel Echo Server 將預設使用ws
引擎,直到有其他選擇。