¡Esto se agrega a la respuesta de @Andrew Moss sobre cómo configurar correctamente VirtualHost
para que funcione con socket.io 1.0! ¡Siéntase libre de omitir la parte sobre CentOS!
Si está atascado en CentOS 6, aquí le mostramos cómo hacerlo:
- Descargue la fuente con respaldo para el
mod_proxy_wstunnel
módulo aquí (clone Gist o descargue los archivos individualmente)
- Instala todo lo necesario para construir:
yum install make gcc httpd-devel
- Configurar un entorno de compilación RPM (básicamente un usuario sin privilegios y algunos directorios)
- Copie el
.c
archivo en la SOURCES
subcarpeta del entorno y el .spec
archivo en la SPECS
subcarpeta.
- correr
rpmbuild -ba mod_proxy_wstunnel.spec
- El paquete ahora está en la
SRPMS
subcarpeta
- Instala el paquete:
rpm -i /path/to/package.rpm
- Lucro
Esto también cargará automáticamente el módulo en Apache, por lo que solo tendrá que reiniciarlo service httpd restart
.
Configurar a VirtualHost
para que realmente sirva el servidor Socket.io y el script de cliente (que está disponible de forma predeterminada en http://your.server/socket.io/socket.io.js
) es un poco más complicado en Apache 2.2, debido a un error en el mod_proxy
módulo :
Dada la siguiente regla de reescritura:
RewriteRule ^/ws(.*)$ ws://localhost:9000/ws [P]
mod_rewrite
trata esto como una ruta de archivo para que el registro de acceso muestre:
[26/Sep/2013:09:46:07 -0400] "GET /ws://localhost:9000/ws HTTP/1.1" 400 317
Por lo tanto, no puede usar ws
-protocol en una regla de reescritura , porque eso se convertirá internamente en una solicitud HTTP GET.
Sin embargo, hay una solución alternativa:
<VirtualHost *:80>
ServerName your.server
# Proxy socket.io Websocket
RewriteEngine On
# socket.io 1.0+ starts all connections with an HTTP polling request
RewriteCond %{QUERY_STRING} transport=polling [NC]
RewriteRule /(.*) http://localhost:8081/$1 [P]
ProxyRequests Off
# Explicitly send the request for the client-script to 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
# Anything else goes to the WebSocket protocol:
ProxyPass /socket.io/ ws://localhost:8081/socket.io/
ProxyPassReverse /socket.io/ ws://localhost:8081/socket.io/
# Any additional stuff (the actual site) comes here
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
</VirtualHost>
Esto asegura que todo lo que se envía /socket.io
va al ws://
protocolo, excepto la solicitud de sondeo largo (que es un mecanismo alternativo cuando WebSockets no está disponible) y la solicitud de la biblioteca cliente.
./buildconfig
para crear el archivo de configuración. Y hubo un par de dependencias que me dijeron que instalara.