Ceci ajoute à la réponse de @Andrew Moss sur la manière de configurer correctement le VirtualHost
pour fonctionner avec socket.io 1.0! N'hésitez pas à ignorer la partie sur CentOS!
Si vous êtes bloqué sur CentOS 6, voici comment faire :
- Téléchargez la source rétroportée pour le module
mod_proxy_wstunnel
ici (cloner le Gist ou télécharger les fichiers individuellement)
- Installez tout ce qui est nécessaire pour la compilation :
yum install make gcc httpd-devel
- Configurez un environnement de compilation RPM (essentiellement un utilisateur non privilégié et quelques répertoires)
- Copiez le fichier
.c
dans le sous-dossier SOURCES
de l'environnement et le fichier .spec
dans le sous-dossier SPECS
.
- Exécutez
rpmbuild -ba mod_proxy_wstunnel.spec
- Le package se trouve maintenant dans le sous-dossier
SRPMS
- Installez le package :
rpm -i /chemin/vers/le/package.rpm
- Profit
Cela chargera également automatiquement le module dans Apache, donc vous n'avez qu'à le redémarrer avec service httpd restart
.
Configurer un VirtualHost
pour servir effectivement le serveur Socket.io et le script client (qui est par défaut disponible sous http://votre.serveur/socket.io/socket.io.js
) est un peu plus compliqué sur Apache 2.2, en raison d'un bug dans le module mod_proxy
:
Étant donné la règle de réécriture suivante :
RewriteRule ^/ws(.*)$ ws://localhost:9000/ws [P]
mod_rewrite
traite cela comme un chemin de fichier, donc le journal d'accès affiche :
[26/Sep/2013:09:46:07 -0400] "GET /ws://localhost:9000/ws HTTP/1.1" 400 317
Ainsi, vous ne pouvez pas utiliser le protocole ws
dans une règle de réécriture, car cela se transformera en une requête GET HTTP interne.
Il y a cependant une solution de contournement :
ServerName votre.serveur
# Proxy socket.io Websocket
RewriteEngine On
# socket.io 1.0+ commence toutes les connexions par une demande de sondage HTTP
RewriteCond %{QUERY_STRING} transport=polling [NC]
RewriteRule /(.*) http://localhost:8081/$1 [P]
ProxyRequests Off
# Envoyer explicitement la demande pour le script client en HTTP :
ProxyPass /socket.io/socket.io.js http://localhost:8081/socket.io/socket.io.js
ProxyPassReverse /socket.io/socket.io.js http://localhost:8081/socket.io/socket.io.js
# Tout le reste va vers le protocole WebSocket :
ProxyPass /socket.io/ ws://localhost:8081/socket.io/
ProxyPassReverse /socket.io/ ws://localhost:8081/socket.io/
# Toutes les autres choses (le site réel) vont ici
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
Cela garantit que tout ce qui est envoyé à /socket.io
soit dirigé vers le protocole ws://
, sauf la demande de sondage à long terme (qui est un mécanisme de repli lorsque les connexions WebSocket ne sont pas disponibles) et la demande de la bibliothèque client.