用于使用 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 之间的所有流量保持加密服务器,因为您的 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
引擎,直到有其他选择。