Servidor NodeJs para transmisión Laravel Echo con Socket.io.
Se requiere lo siguiente para funcionar correctamente.
Puede encontrar información adicional sobre la transmisión con Laravel en los documentos oficiales: https://laravel.com/docs/master/broadcasting
Instale el paquete npm globalmente con el siguiente comando:
$ npm install -g laravel-echo-server
Ejecute el comando init en el directorio de su proyecto:
$ laravel-echo-server init
La herramienta cli lo ayudará a configurar un archivo laravel-echo-server.json en el directorio raíz de su proyecto. Este archivo será cargado por el servidor durante el inicio. Puede editar este archivo más adelante para administrar la configuración de su servidor.
Laravel Echo Server expone una API http ligera para realizar la funcionalidad de transmisión. Por motivos de seguridad, el acceso a estos puntos finales desde referencias http debe autenticarse con una identificación y una clave de la aplicación. Esto se puede generar usando el comando cli:
$ laravel-echo-server client:add APP_ID
Si ejecuta client:add
sin un argumento de identificación de aplicación, se generará uno para usted. Después de ejecutar este comando, la identificación y la clave del cliente se mostrarán y almacenarán en el archivo laravel-echo-server.json .
En este ejemplo, se permitirán solicitudes siempre que la identificación y la clave de la aplicación se proporcionen con solicitudes http.
Request Headers
Authorization: Bearer skti68i...
or
http://app.dev:6001/apps/APP_ID/channels?auth_key=skti68i...
Puede eliminar clientes con laravel-echo-server client:remove APP_ID
en el directorio raíz de su proyecto, ejecute
$ laravel-echo-server start
en el directorio raíz de su proyecto, ejecute
$ laravel-echo-server stop
Edite la configuración predeterminada del servidor agregando opciones a su archivo laravel-echo-server.json .
Título | Por defecto | Descripción |
---|---|---|
apiOriginAllow | {} | Configuración para permitir el acceso a la API a través de CORS. Ejemplo |
authEndpoint | /broadcasting/auth | La ruta que autentica canales privados |
authHost | http://localhost | El host del servidor que autentica los canales privados y de presencia. |
database | redis | Base de datos utilizada para almacenar datos que deben persistir, como los miembros del canal de presencia. Las opciones actualmente son redis y sqlite |
databaseConfig | {} | Configuraciones para los diferentes controladores de base de datos Ejemplo |
devMode | false | Agrega registros adicionales para fines de desarrollo. |
host | null | El host del servidor socket.io ex. app.dev . null aceptará conexiones en cualquier dirección IP |
port | 6001 | El puerto en el que debe ejecutarse el servidor socket.io |
protocol | http | Debe ser http o https |
sslCertPath | '' | La ruta al certificado SSL de su servidor. |
sslKeyPath | '' | La ruta a la clave SSL de su servidor |
sslCertChainPath | '' | La ruta a la cadena de certificados SSL de su servidor |
sslPassphrase | '' | La frase de contraseña que se utilizará para el certificado (si corresponde) |
socketio | {} | Opciones para pasar a la instancia de socket.io (opciones disponibles) |
subscribers | {"http": true, "redis": true} | Permite desactivar suscriptores individualmente. Suscriptores disponibles: http y redis |
Si se encuentra un archivo .env en el mismo directorio que el archivo laravel-echo-server.json, se pueden anular las siguientes opciones:
authHost
: LARAVEL_ECHO_SERVER_AUTH_HOST
Nota : esta opción recurrirá a la opción LARAVEL_ECHO_SERVER_HOST
como predeterminada si está configurada en el archivo .env.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
Nota: Actualmente, esta biblioteca solo admite la publicación desde http o https, no desde ambos.
Si tiene dificultades para implementar SSL con este paquete, puede considerar el uso de un módulo proxy dentro de Apache o NginX. Básicamente, en lugar de conectar su tráfico websocket a https://yourserver.dev:6001/socket.io?..... e intentar protegerlo, puede conectar su tráfico websocket a https://yourserver.dev/socket .io. Detrás de escena, el módulo proxy de Apache o NginX se configurará para interceptar solicitudes de /socket.io y redirigirlas internamente a su servidor echo a través de un puerto no SSL en 6001. Esto mantiene todo el tráfico cifrado entre el navegador y la web. servidor, ya que su servidor web seguirá realizando el cifrado/descifrado SSL. Lo único que no queda seguro es el tráfico entre su servidor web y su servidor Echo, lo que podría ser aceptable en muchos casos.
#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
El directorio de trabajo en el que laravel-echo-server
buscará el archivo de configuración laravel-echo-server.json
se puede pasar al comando start
a través del parámetro --dir
así: laravel-echo-server start --dir=/var/www/html/example.com/configuration
Laravel Echo Server se suscribe a eventos entrantes con dos métodos: Redis y Http.
Su aplicación principal puede usar Redis para publicar eventos en canales. El servidor Laravel Echo se suscribirá a esos canales y transmitirá esos mensajes a través de socket.io.
Usando Http, también puedes publicar eventos en Laravel Echo Server de la misma manera que lo harías con Redis enviando un channel
y message
al punto final de transmisión. Debe generar una clave API como se describe en la sección Clientes API y proporcionar la clave API correcta.
Solicitar punto final
POST http://app.dev:6001/apps/your-app-id/events?auth_key=skti68i...
Cuerpo de solicitud
{
"channel" : " channel-name " ,
"name" : " event-name " ,
"data" : {
"key" : " value "
},
"socket_id" : " h3nAdb134tbvqwrg "
}
canal : el nombre del canal al que transmitir un evento. Para canales privados o de presencia, anteponga private-
o presence-
. canales : en lugar de un solo canal, puede transmitir a una variedad de canales con 1 solicitud. nombre : una cadena que representa la clave del evento dentro de su aplicación. datos : datos que le gustaría transmitir al canal. socket_id (opcional) : la identificación del socket del usuario que inició el evento. Cuando esté presente, el servidor sólo "transmitirá a otros".
El suscriptor HTTP es compatible con el suscriptor Laravel Pusher. Simplemente configure el host y el puerto para su servidor Socket.IO y configure la identificación y la clave de la aplicación en config/broadcasting.php. No se requiere secreto.
' pusher ' => [
' driver ' => ' pusher ' ,
' key ' => env ( ' PUSHER_KEY ' ),
' secret ' => null ,
' app_id ' => env ( ' PUSHER_APP_ID ' ),
' options ' => [
' host ' => ' localhost ' ,
' port ' => 6001 ,
' scheme ' => ' http '
],
],
Ahora puedes enviar eventos usando HTTP, sin usar Redis. Esto también le permite usar la API de Pusher para enumerar canales/usuarios como se describe en la biblioteca PHP de Pusher.
La API HTTP expone puntos finales que le permiten recopilar información sobre su servidor y canales en ejecución.
Estado Obtenga el número total de clientes, el tiempo de actividad del servidor y el uso de memoria.
GET /apps/:APP_ID/status
Canales Lista de todos los canales.
GET /apps/:APP_ID/channels
Canal Obtener información sobre un canal en particular.
GET /apps/:APP_ID/channels/:CHANNEL_NAME
Usuarios del canal Lista de usuarios de un canal.
GET /apps/:APP_ID/channels/:CHANNEL_NAME/users
El acceso entre dominios se puede especificar en el archivo laravel-echo-server.json cambiando allowCors
en apiOriginAllow
a true
. Luego puede configurar CORS Access-Control-Allow-Origin, Access-Control-Allow-Methods como una cadena separada por comas (GET y POST están habilitados de forma predeterminada) y Access-Control-Allow-Headers que la API puede recibir.
Ejemplo a continuación:
{
"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 "
}
}
Esto le permite enviar solicitudes a la API a través de AJAX desde una aplicación que puede estar ejecutándose en el mismo dominio pero en un puerto diferente o en un dominio completamente diferente.
Para conservar los datos del canal de presencia, se admite el uso de Redis o SQLite como almacén de clave/valor. La clave es el nombre del canal y el valor es la lista de miembros del canal de presencia.
Cada controlador de base de datos se puede configurar en el archivo laravel-echo-server.json bajo la propiedad databaseConfig
. Las opciones se transmiten al proveedor de la base de datos, por lo que los desarrolladores pueden configurarlas como deseen.
Por ejemplo, si quisieras pasar una configuración personalizada a Redis:
{
"databaseConfig" : {
"redis" : {
"port" : " 3001 " ,
"host" : " redis.app.dev " ,
"keyPrefix" : " my-redis-prefix "
}
}
}
Nota: No se debe utilizar ningún esquema (http/https, etc.) para la dirección del host.
Puede encontrar una lista completa de las opciones de Redis aquí.
Por ejemplo, si desea utilizar redis-sentinel, debe pasar una configuración personalizada:
"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 "
},
},
Para obtener más información sobre la configuración de Redis Sentinel, puede consultar esto
Con SQLite quizás te interese cambiar la ruta donde se almacena la base de datos.
{
"databaseConfig" : {
"sqlite" : {
"databasePath" : " /path/to/laravel-echo-server.sqlite "
}
}
}
Nota 1: La ruta es relativa a la raíz de su aplicación, no a su sistema.
Nota 2: se requiere node-sqlite3 para esta base de datos. Instálelo antes de usarlo.
npm install sqlite3 -g
Cuando los usuarios se unen a un canal de presencia, los datos de autenticación del canal de presencia se almacenan mediante Redis.
Si bien los canales de presencia contienen una lista de usuarios, habrá casos en los que un usuario se una a un canal de presencia varias veces. Por ejemplo, esto ocurriría al abrir varias pestañas del navegador. En esta situación, los eventos de "unirse" y "salir" solo se emiten a la primera y última instancia del usuario.
Opcionalmente, puede configurar laravel-echo-server para publicar un evento en cada actualización de un canal de presencia, configurando databaseConfig.publishPresence
en true
:
{
"database" : " redis " ,
"databaseConfig" : {
"redis" : {
"port" : " 6379 " ,
"host" : " localhost "
},
"publishPresence" : true
}
}
Puede utilizar la integración de Redis de Laravel para activar el código de la aplicación desde allí:
Redis :: subscribe ([ ' PresenceChannelUpdated ' ], function ( $ message ) {
var_dump ( $ message );
});
Consulte la documentación oficial de Laravel para obtener más información. https://laravel.com/docs/master/broadcasting#introduction
Puede incluir la biblioteca cliente socket.io desde su servidor en ejecución. Por ejemplo, si su servidor se ejecuta en app.dev:6001
debería poder agregar una etiqueta de secuencia de comandos a su html de esta manera:
<script src="//app.dev:6001/socket.io/socket.io.js"></script>
Nota: Cuando utilice la biblioteca cliente socket.io desde su servidor en ejecución, recuerde verificar que la variable global io
esté definida antes de suscribirse a eventos.
µWebSockets ha quedado oficialmente obsoleto. Actualmente no hay soporte para µWebSockets en Socket.IO, pero es posible que tenga el nuevo soporte ClusterWS entrante. Mientras tanto, Laravel Echo Server usará el motor ws
de forma predeterminada hasta que haya otra opción.