Serveur NodeJs pour la diffusion de Laravel Echo avec Socket.io.
Les éléments suivants sont nécessaires pour fonctionner correctement.
Des informations supplémentaires sur la diffusion avec Laravel peuvent être trouvées sur la documentation officielle : https://laravel.com/docs/master/broadcasting
Installez le package npm globalement avec la commande suivante :
$ npm install -g laravel-echo-server
Exécutez la commande init dans le répertoire de votre projet :
$ laravel-echo-server init
L'outil cli vous aidera à configurer un fichier laravel-echo-server.json dans le répertoire racine de votre projet. Ce fichier sera chargé par le serveur lors du démarrage. Vous pourrez modifier ce fichier ultérieurement pour gérer la configuration de votre serveur.
Le Laravel Echo Server expose une API http légère pour exécuter la fonctionnalité de diffusion. Pour des raisons de sécurité, l'accès à ces points de terminaison à partir des référents http doit être authentifié avec un identifiant et une clé APP. Ceci peut être généré à l'aide de la commande cli :
$ laravel-echo-server client:add APP_ID
Si vous exécutez client:add
sans argument d'identifiant d'application, un sera généré pour vous. Après avoir exécuté cette commande, l'identifiant et la clé du client seront affichés et stockés dans le fichier laravel-echo-server.json .
Dans cet exemple, les requêtes seront autorisées tant que l'identifiant et la clé de l'application sont tous deux fournis avec les requêtes http.
Request Headers
Authorization: Bearer skti68i...
or
http://app.dev:6001/apps/APP_ID/channels?auth_key=skti68i...
Vous pouvez supprimer des clients avec laravel-echo-server client:remove APP_ID
dans le répertoire racine de votre projet, exécutez
$ laravel-echo-server start
dans le répertoire racine de votre projet, exécutez
$ laravel-echo-server stop
Modifiez la configuration par défaut du serveur en ajoutant des options à votre fichier laravel-echo-server.json .
Titre | Défaut | Description |
---|---|---|
apiOriginAllow | {} | Configuration pour permettre l'accès à l'API via CORS. Exemple |
authEndpoint | /broadcasting/auth | La route qui authentifie les chaînes privées |
authHost | http://localhost | L'hôte du serveur qui authentifie les canaux privés et de présence |
database | redis | Base de données utilisée pour stocker les données qui doivent persister, comme les membres du canal de présence. Les options sont actuellement redis et sqlite |
databaseConfig | {} | Configurations pour les différents pilotes de base de données Exemple |
devMode | false | Ajoute une journalisation supplémentaire à des fins de développement |
host | null | L'hôte du serveur socket.io ex. app.dev . null acceptera les connexions sur n'importe quelle adresse IP |
port | 6001 | Le port sur lequel le serveur socket.io doit s'exécuter |
protocol | http | Doit être http ou https |
sslCertPath | '' | Le chemin d'accès au certificat SSL de votre serveur |
sslKeyPath | '' | Le chemin d'accès à la clé SSL de votre serveur |
sslCertChainPath | '' | Le chemin d'accès à la chaîne de certificats SSL de votre serveur |
sslPassphrase | '' | La phrase de passe à utiliser pour le certificat (le cas échéant) |
socketio | {} | Options à transmettre à l'instance socket.io (options disponibles) |
subscribers | {"http": true, "redis": true} | Permet de désactiver les abonnés individuellement. Abonnés disponibles : http et redis |
Si un fichier .env se trouve dans le même répertoire que le fichier laravel-echo-server.json, les options suivantes peuvent être remplacées :
authHost
: LARAVEL_ECHO_SERVER_AUTH_HOST
Remarque : Cette option reviendra à l'option LARAVEL_ECHO_SERVER_HOST
par défaut si elle est définie dans le fichier .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
Remarque : Cette bibliothèque ne prend actuellement en charge que la diffusion à partir de http ou de https, pas les deux.
Si vous avez du mal à implémenter SSL avec ce package, vous pouvez envisager d'utiliser un module proxy dans Apache ou NginX. Essentiellement, au lieu de connecter votre trafic websocket à https://yourserver.dev:6001/socket.io?..... et d'essayer de le sécuriser, vous pouvez connecter votre trafic websocket à https://yourserver.dev/socket .io. En coulisses, le module proxy d'Apache ou NginX sera configuré pour intercepter les requêtes pour /socket.io et les rediriger en interne vers votre serveur d'écho via non SSL sur le port 6001. Cela maintient tout le trafic crypté entre le navigateur et le Web. serveur, car votre serveur Web effectuera toujours le cryptage/déchiffrement SSL. La seule chose qui n'est pas sécurisée est le trafic entre votre serveur Web et votre serveur Echo, ce qui peut être acceptable dans de nombreux cas.
#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
Le répertoire de travail dans lequel laravel-echo-server
recherchera le fichier de configuration laravel-echo-server.json
peut être transmis à la commande start
via le paramètre --dir
comme ceci : laravel-echo-server start --dir=/var/www/html/example.com/configuration
Le Laravel Echo Server s'abonne aux événements entrants avec deux méthodes : Redis & Http.
Votre application principale peut utiliser Redis pour publier des événements sur des canaux. Le serveur Laravel Echo s'abonnera à ces chaînes et diffusera ces messages via socket.io.
À l'aide de HTTP, vous pouvez également publier des événements sur le serveur Laravel Echo de la même manière que vous le feriez avec Redis en soumettant un channel
et message
au point de terminaison de diffusion. Vous devez générer une clé API comme décrit dans la section Clients API et fournir la clé API correcte.
Demander un point de terminaison
POST http://app.dev:6001/apps/your-app-id/events?auth_key=skti68i...
Corps de la demande
{
"channel" : " channel-name " ,
"name" : " event-name " ,
"data" : {
"key" : " value "
},
"socket_id" : " h3nAdb134tbvqwrg "
}
canal - Le nom de la chaîne sur laquelle diffuser un événement. Pour les canaux privés ou de présence, ajoutez private-
ou presence-
. chaînes - Au lieu d'une seule chaîne, vous pouvez diffuser sur un ensemble de chaînes avec 1 requête. name - Une chaîne qui représente la clé d'événement dans votre application. data - Données que vous souhaitez diffuser sur la chaîne. socket_id (facultatif) - L'identifiant de socket de l'utilisateur qui a initié l'événement. Lorsqu'il est présent, le serveur "diffusera uniquement vers les autres".
L'abonné HTTP est compatible avec l'abonné Laravel Pusher. Configurez simplement l'hôte et le port de votre serveur Socket.IO et définissez l'identifiant et la clé de l'application dans config/broadcasting.php. Le secret n'est pas requis.
' pusher ' => [
' driver ' => ' pusher ' ,
' key ' => env ( ' PUSHER_KEY ' ),
' secret ' => null ,
' app_id ' => env ( ' PUSHER_APP_ID ' ),
' options ' => [
' host ' => ' localhost ' ,
' port ' => 6001 ,
' scheme ' => ' http '
],
],
Vous pouvez désormais envoyer des événements via HTTP, sans utiliser Redis. Cela vous permet également d'utiliser l'API Pusher pour lister les canaux/utilisateurs comme décrit dans la bibliothèque Pusher PHP.
L'API HTTP expose les points de terminaison qui vous permettent de collecter des informations sur votre serveur et vos canaux en cours d'exécution.
Statut Obtenez le nombre total de clients, la disponibilité du serveur et l'utilisation de la mémoire.
GET /apps/:APP_ID/status
Chaînes Liste de toutes les chaînes.
GET /apps/:APP_ID/channels
Chaîne Obtenez des informations sur une chaîne particulière.
GET /apps/:APP_ID/channels/:CHANNEL_NAME
Utilisateurs du canal Liste des utilisateurs d'un canal.
GET /apps/:APP_ID/channels/:CHANNEL_NAME/users
L'accès entre domaines peut être spécifié dans le fichier laravel-echo-server.json en modifiant allowCors
dans apiOriginAllow
par true
. Vous pouvez ensuite définir les CORS Access-Control-Allow-Origin, Access-Control-Allow-Methods sous forme de chaîne séparée par des virgules (GET et POST sont activés par défaut) et les Access-Control-Allow-Headers que l'API peut recevoir.
Exemple ci-dessous :
{
"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 "
}
}
Cela vous permet d'envoyer des requêtes à l'API via AJAX à partir d'une application qui peut s'exécuter sur le même domaine mais sur un port différent ou sur un domaine totalement différent.
Pour conserver les données du canal de présence, l'utilisation de Redis ou SQLite comme magasin de clé/valeur est prise en charge. La clé étant le nom du canal et la valeur étant la liste des membres du canal de présence.
Chaque pilote de base de données peut être configuré dans le fichier laravel-echo-server.json sous la propriété databaseConfig
. Les options sont transmises au fournisseur de base de données, les développeurs sont donc libres de les configurer comme ils le souhaitent.
Par exemple, si vous souhaitez transmettre une configuration personnalisée à Redis :
{
"databaseConfig" : {
"redis" : {
"port" : " 3001 " ,
"host" : " redis.app.dev " ,
"keyPrefix" : " my-redis-prefix "
}
}
}
Remarque : Aucun schéma (http/https, etc.) ne doit être utilisé pour l'adresse de l'hôte.
Une liste complète des options Redis peut être trouvée ici.
Par exemple, si vous souhaitez utiliser redis-sentinel, vous devez passer une configuration personnalisée :
"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 "
},
},
Pour plus d'informations sur la configuration de Redis Sentinel, vous pouvez vérifier ceci
Avec SQLite, vous souhaiterez peut-être modifier le chemin où la base de données est stockée.
{
"databaseConfig" : {
"sqlite" : {
"databasePath" : " /path/to/laravel-echo-server.sqlite "
}
}
}
Remarque 1 : Le chemin est relatif à la racine de votre application et non à votre système.
Remarque 2 : node-sqlite3 est requis pour cette base de données. Veuillez installer avant utilisation.
npm install sqlite3 -g
Lorsque les utilisateurs rejoignent un canal de présence, leurs données d'authentification de canal de présence sont stockées à l'aide de Redis.
Bien que les canaux de présence contiennent une liste d'utilisateurs, il y aura des cas où un utilisateur rejoindra un canal de présence plusieurs fois. Par exemple, cela se produirait lors de l’ouverture de plusieurs onglets de navigateur. Dans cette situation, les événements « rejoindre » et « quitter » ne sont émis qu’à la première et à la dernière instance de l’utilisateur.
En option, vous pouvez configurer laravel-echo-server pour publier un événement à chaque mise à jour sur un canal de présence, en définissant databaseConfig.publishPresence
sur true
:
{
"database" : " redis " ,
"databaseConfig" : {
"redis" : {
"port" : " 6379 " ,
"host" : " localhost "
},
"publishPresence" : true
}
}
Vous pouvez utiliser l'intégration Redis de Laravel pour déclencher le code d'application à partir de là :
Redis :: subscribe ([ ' PresenceChannelUpdated ' ], function ( $ message ) {
var_dump ( $ message );
});
Consultez la documentation officielle de Laravel pour plus d'informations. https://laravel.com/docs/master/broadcasting#introduction
Vous pouvez inclure la bibliothèque client socket.io à partir de votre serveur en cours d'exécution. Par exemple, si votre serveur s'exécute sur app.dev:6001
vous devriez pouvoir ajouter une balise de script à votre code HTML comme suit :
<script src="//app.dev:6001/socket.io/socket.io.js"></script>
Remarque : lorsque vous utilisez la bibliothèque client socket.io depuis votre serveur en cours d'exécution, n'oubliez pas de vérifier que la variable globale io
est définie avant de vous abonner aux événements.
µWebSockets est officiellement obsolète. Actuellement, il n'y a pas de support pour µWebSockets dans Socket.IO, mais il se peut que le nouveau support ClusterWS soit entrant. Pendant ce temps, Laravel Echo Server utilisera le moteur ws
par défaut jusqu'à ce qu'il y ait une autre option.