2011-10-07 27 views
6

Estoy buscando una forma de integrar Node.js + Socket.io + Apache de la siguiente manera: Quiero que apache continúe publicando archivos HTML/JS. Quiero Node.js a la escucha de conexión en el puerto 8080. Algo como esto:Node.js + Socket.io + Apache

var util = require("util"), 
    app = require('http').createServer(handler), 
    io = require('/socket.io').listen(app), 
    fs = require('fs'), 
    os = require('os'), 
    url = require('url'); 

app.listen(8080); 

function handler (req, res) { 

    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    res.writeHead(200); 
    res.end(data); 
    }); 
} 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 

    socket.on('my other event', function (data) { 
    socket.emit('ok 1', { hello: 'world' }); 
    }); 

    socket.on('clientMSG', function (data) { 
    socket.emit('ok 2', { hello: 'world' }); 
    }); 

}); 

si puedo acceder a un HTML que se conectan a este servidor, funciona, pero tengo que ir a mydomian.com:8080 /index.html. Lo que quiero es poder ir a mydomian.com/index.html. y ser capaz de abrir una conexión de socket:

<script> 
     var socket = io.connect('http://mydomain.com', {port: 8080}); 
     socket.on('news', function (data) { 
      console.log(data); 
      socket.emit('my other event', { my: 'data from the client' }); 
     }); 

     socket.on('connect', function (data) { 
      console.log("connect"); 
     }); 

     socket.on('disconnect', function (data) { 
      console.log("disconnect"); 
     }); 


      //call this function when a button is clicked 
     function sendMSG() 
     { 
      console.log("sendMSG"); 
      socket.emit('clientMSG', { msg: 'non-scheduled message from client' }); 
     } 

    </script> 

En este ejemplo, tuve que usar fs.readFile de costumbre trabajo cuando voy al puerto 8080 en la URL.

¿Alguna sugerencia? Tks.

+0

Pruebe nginx en lugar de apache, especialmente si solo desea mostrar archivos estáticos. Apache inicia un nuevo hilo para cada solicitud que es parcialmente contrario a la filosofía/razón de usar el nodo. – badunk

Respuesta

14

servir a su contenido estático desde el puerto de Apache 80 y servir a su contenido dinámico/datos a través de un servidor Socket.IO en el puerto 8080. No es necesario el app = require('http').createServer(handler) en su aplicación Socket.IO puerto

Apache 80 | ------------- | clientes | ------------ | puerto Socket.IO 8080

var io = require('socket.io').listen(8080); 

io.sockets.on('connection', function (socket) { 
    io.sockets.emit('this', { will: 'be received by everyone'}); 

    socket.on('clientMSG', function (from, msg) { 
    console.log('I received a private message by ', from, ' saying ', msg); 
    }); 

    socket.on('disconnect', function() { 
    sockets.emit('user disconnected'); 
    }); 
}); 
+0

Gracias por la respuesta. Hice el cambio y ahora parece que el cliente no obtiene el archivo /socket.io/socket.io.js. ¿Este servidor está servido por el servidor HTTP en el nodo? – oscarm

+1

Lo tengo trabajando. cambió el camino a /socket.io-client/dist/socket.io.js ¡Gracias! – oscarm

+1

Sí, querrá servir el socket.io.js desde su servidor Apache estático en el puerto 80 y hacer algo como en su código de cliente – EhevuTov

4

AWS + APACHE + + nodejs SOCKET.IO + AngularJS

SERVIDOR LADO
Esto funcionó para mí en un servidor de producción con Apache en el puerto 80 y NodeJS en el puerto 8000. Cambie el puerto NodeJS por la opción que desee ...

  1. Crear una carpeta llamada “nodejs” para los archivos del servidor de NodeJS en/var/www/html
  2. Run nodejs en un puerto distinto del 80, por ejemplo el puerto 8000
  3. Ejecutar comando: proxy_http a2enmod
  4. comando de ejecución: proxy_wstunnel a2enmod
  5. Ponga los próximos 2 líneas al final del archivo siguiente: /etc/apache2/apache2.conf

    LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so 
    LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so 
    
  6. Ponga los próximos 12 líneas al final del archivo siguiente : /sentar ES-disponibles/000-default.conf
    (Si usted tiene un sitio diferente creado por usted, poner las líneas allí)

    RewriteEngine On 
    RewriteCond %{REQUEST_URI} ^socket.io   [NC] 
    RewriteCond %{QUERY_STRING} transport=websocket [NC] 
    RewriteRule /{.*}  ws://localhost:8000/$1 [P,L] 
    
    RewriteCond %{HTTP:Connection} Upgrade [NC] 
    RewriteRule /(.*) ws://localhost:8000/$1 [P,L] 
    
    ProxyPass /nodejs http://localhost:8000/ 
    ProxyPassReverse /nodejs http://localhost:8000/ 
    
    
    ProxyPass /socket.io http://localhost:8000/socket.io 
    ProxyPassReverse /socket.io http://loacalhost:8000/socket.io 
    
    ProxyPass /socket.io ws://localhost:8000/socket.io 
    ProxyPassReverse /socket.io ws://localhost:8000/socket.io 
    
  7. sudo servicio apache2 restart


CLIENTE SIDE
Utilizo el siguiente library para implementar Socket.io en AngularJS, pero Creo que esta guía
es útil también para una implementación básica de Javascript de la tecnología socket.io

Llamar a mi servidor PHP: ejemplo.com
Para llamar servidor NodeJS: example.com/nodejs
Para llamar NodeJS zócalo: example.com < --- esta llamada se hace por defecto por la biblioteca

espero que te ayude!

+0

Gracias, pude resolver el problema al ejecutar socket.io en un servidor apache. – prateekkathal

Cuestiones relacionadas