Configuration de plusieurs applications socket.io/node.js sur un serveur Apache?

Je me suis récemment amusé avec socket.io et node.js et après avoir réussi à créer une application basée sur le chat, je voulais créer une autre application Web similaire. Je l’ai terminée et tout fonctionnait bien lorsque j’hébergeais localement sur mon ordinateur, mais une fois que je l’ai mis sur mon serveur Web, il a cessé de fonctionner. Le noeud servait parfaitement la page, mais la connexion socket.io n’était pas établie. Cela est dû à la façon dont j’ai configuré mes parameters de proxy Apache pour que l’application précédente fonctionne. Quelques informations à ce sujet:

Lorsque j’ai terminé le premier programme, j’ai eu du mal à s’exécuter sur le serveur distant. J’avais hébergé l’application sur le port 3000 et j’essayais de faire en sorte qu’apache transmette une certaine URL à ce port. Je voulais que http://example.com/app1 essentiellement à http://example.com:3000 . Cela s’est produit après l’ajout de ProxyPass /app1 http://localhost:3000 au fichier de configuration d’Apache, ce qui m’a placé dans une situation similaire à celle décrite ci-dessus. La page elle-même s’est bien chargée, mais aucune connexion à socket.io n’a été établie. J’ai réalisé que le problème était que le client recherchait socket.io à l’URL http://example.com/socket.io . Comme seul le sous /app1 répertoire /app1 était transféré vers le port 3000, il était logique que le client ne puisse pas se connecter correctement au serveur. Pour résoudre ce problème, j’ai ajouté ProxyPass /socket.io http://localhost:3000/socket.io au fichier de configuration d’Apache. Cela a essentiellement résolu le problème car toutes les demandes de socket.io étaient maintenant envoyées au port approprié.

Cela a bien fonctionné pour moi jusqu’à ce que je souhaite configurer une deuxième application sur un port différent. Le client de la deuxième application avait l’adresse http://example.com/app2 , qui était à nouveau transférée vers un port du serveur Web, le port 3001 cette fois, à l’aide de ProxyPass /app2 http://localhost:3001 . Comme je l’ai décrit précédemment, la page elle-même s’est chargée correctement, mais la connexion socket.io n’a pas été établie. Cette nouvelle page client envoyait à nouveau toutes les demandes socket.io à http://example.com/socket.io . Comme vous pouvez le deviner, tout le trafic de la page client de la deuxième application était envoyé au mauvais serveur. J’ai changé le port sur lequel /socket.io était transféré de 3000 à 3001, ce qui a permis à la deuxième application de fonctionner correctement, mais la première application a exactement le même problème.

Quoi que je fasse, je ne peux pas demander aux pages clientes de demander à socket.io de se trouver sous l’URL de l’application, comme http://example.com/app1/socket.io . Je peux modifier la ligne de source de script dans la page client en quelque chose comme (avec ou sans le ‘/’) et le fait pas travailler. Je suppose que le problème consiste essentiellement à essayer de trouver un moyen d’exécuter simultanément deux serveurs node.js / socket.io complètement séparés.

TL; DR: Comment puis-je avoir deux serveurs socket.io s’exécutant simultanément sur le même serveur Apache?

Comme vous l’avez déjà vu, socket.io initie par défaut toutes les connexions avec la même URL. Par défaut, vos deux applications utiliseront exactement la même URL. Par conséquent, votre serveur Apache ne peut pas dire lequel est lequel pour les utiliser de manière différente.

Ainsi, le seul moyen de résoudre ce problème consiste à configurer l’une de vos installations socket.io (client et serveur) afin qu’elle utilise un chemin personnalisé que vous pouvez ensuite passer séparément du chemin socket.io par défaut.

Vous pouvez définir le chemin du serveur lors de la construction du serveur, comme décrit ici .

 const server = require('http').createServer(); const io = require('socket.io')(server, { path: '/myownpath' }); server.listen(3000); 

Vous pouvez définir le chemin de demande du client lors de la connexion dans le client, comme décrit ici .

 const socket = io('http://localhost', { path: '/myownpath' });