2011-10-07 8 views
6

Sto cercando un modo per integrare Node.js + Socket.io + Apache nel modo seguente: Desidero che apache continui a pubblicare file HTML/JS. Voglio node.js per ascoltare per la connessione sulla porta 8080. Qualcosa di simile a questo: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' }); 
    }); 

}); 

se accedo un codice HTML che si collegano a questo server, funziona, ma ho bisogno di andare a mydomian.com:8080 /index.html. Quello che voglio è poter andare su mydomian.com/index.html. ed essere in grado di aprire una connessione 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> 

In questo esempio dovuto usare fs.readFile di solito lavoro quando vado alla porta 8080 nella URL.

Qualche suggerimento? Tks.

+0

Provate nginx invece di apache, specialmente se volete solo servire file statici. Apache avvia un nuovo thread per ogni richiesta che è parzialmente in contrasto con la filosofia/ragione dell'utilizzo del nodo. – badunk

risposta

14

servire i vostri contenuti statici dalla porta Apache 80 e servire i contenuti dinamici/dati su un server Socket.IO sulla porta 8080. Non è necessario il app = require('http').createServer(handler) nel vostro Socket.IO app porta

Apache 80 | ------------- | clienti | ------------ | porto 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

Grazie per la risposta. Ho fatto la modifica e ora sembra che il client non abbia il file /socket.io/socket.io.js. Questo file è servito dal server HTTP nel nodo? – oscarm

+1

Ho funzionato. cambiato il percorso in /socket.io-client/dist/socket.io.js Grazie! – oscarm

+1

Sì, vorrai servire socket.io.js dal tuo server statico Apache sulla porta 80 e fare qualcosa come sul tuo codice lato client – EhevuTov

4

AWS + APACHE + NODEJS + SOCKET.IO + ANGULARJS

Server Side
Questo ha funzionato per me su un server di produzione in esecuzione apache sulla porta 80 e NodeJS sulla porta 8000. Modificare la porta NodeJS in base all'opzione desiderata ...

  1. Creare una cartella denominata “nodejs” per i file del server NodeJS in/var/www/html
  2. Run Nodejs su una porta diversa dalla 80, ad esempio la porta 8000
  3. Esegue il comando: proxy_http a2enmod
  4. eseguire il comando: proxy_wstunnel a2enmod
  5. Mettere i prossimi 2 linee alla fine del seguente file: /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. Mettere le 12 righe seguenti alla fine del file seguente :/sit es-disponibili/000-default.conf
    (Se si dispone di un sito diverso creato da voi, mettere le linee di lì)

    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 service apache2 restart


CLIENT SIDE
Io uso il seguente library per implementare Socket.io in AngularJS, ma Penso che questa guida
sia anch'essa utile per un'implementazione Javascript di base della tecnologia socket.io.

Per chiamare il mio server PHP: esempio.com
Per chiamare server di NodeJS: example.com/nodejs
Per chiamare NodeJS Socket: example.com < --- questa chiamata sarà fatto per difetto dalla libreria

spero aiuto voi!

+0

Grazie, sono stato in grado di risolvere il problema con l'esecuzione di socket.io su un server Apache. – prateekkathal