2011-09-12 2 views
10

Spero che questo non venire attraverso come una questione terribilmente stupida, ma sto imparando come implementare un server socket.io per il mio sito web per la produzione di applicazioni in tempo reale, ma il mio problema è che non riesco a capire come implementare le suddette applicazioni in un ambiente servito Apache. Attualmente, quando eseguo node server.js per avviare il mio server socket.io, devo accedervi visitando http://localhost:XXXX dove XXXX è qualsiasi porta a cui lo allego, naturalmente. Non voglio che il mio sito Web sia forzato ad essere visualizzato su una porta alternativa come questa, ma ovviamente non posso collegare il server alla porta 80 poiché Apache lo sta ascoltando.accesso al server tramite socket.io Apache servita pagine

Ovviamente una soluzione naturale sarebbe quella di arrestare il servizio Apache e quindi fare il nodo del server sulla porta 80 in questo modo per evitare una collisione, ma non voglio sacrificare tutte le funzionalità offerte da Apache. Fondamentalmente, voglio continuare a servire il mio sito web tramite Apache sulla porta 80, e integrare alcuni aspetti delle applicazioni in tempo reale tramite socket.io sulla porta 3000, diciamo.

C'è un modo per fare questo che evitare le cose che non voglio? Essendo 1) gli utenti accedono al mio sito con :3000 nell'URL, 2) disabilitano Apache, 3) utilizzando gli iframe.

Grazie in anticipo.

risposta

3

In generale, si dovrebbe essere in grado di nascondere Node.js con mod_proxy. Un po 'di ricerca ha trovato questo: https://github.com/sindresorhus/guides/blob/master/run-node-server-alongside-apache.md (il vecchio link è morto, questo è uno nuovo)

Tuttavia, Socket.io può essere un po' pignolo (https://github.com/LearnBoost/socket.io/issues/25), quindi potresti avere problemi con esso in particolare.

Come quel biglietto è un po 'vecchio, vale la pena un colpo. Non essere sorpreso se hai problemi. La prossima scommessa è quella di associare Node.js toport 80 e farlo funzionare come proxy inverso per Apache con https://github.com/nodejitsu/node-http-proxy (ancora sotto un discreto sviluppo).

La soluzione ottimale sarebbe eseguirlo su di essa la proprio server e solo sei traffico presa andare a socket.example.com o qualcosa di simile.

+0

Il secondo metodo elencato è quello che ho implementato finora, sebbene richiedesse una quantità piuttosto ampia di riconfigurazione delle direttive Apache. Ora che è implementato, mi sento come se l'intero processo fosse stato contro-intuitivo e non mi avesse davvero avvicinato a quello che dovevo ottenere, a parte legare entrambi i server alla "stessa" porta. Penso che guarderò più in mod_proxy e vedere se non è una soluzione più prudente. Un problema ricorrente è che non ho necessariamente bisogno di servire interi documenti con socket.io .. semplicemente WIDGET su pagine selezionate. Un "div di port", se vuoi. –

+0

Il primo collegamento menzionato è morto –

+0

aggiornato con un nuovo collegamento –

2

Socket.io ha più meccanismi di trasporto. Alcuni di essi non funzionano se si esegue Apache come proxy inverso, ma alcuni lo fanno. I trasporti che non funzionano sono websocket e flash, ma il polling xhr e il polling jsonp dovrebbero funzionare.

Ecco un esempio su come impostare l'opzione di configurazione per trasporti socket.io:

var io = require("socket.io").listen(server); 
io.set("transports", ["xhr-polling", "jsonp-polling"]); 

Sul mio Apache sto usando il normale name based virtual hosts and reverse proxy setup e con questi trasporti il ​​socket.io sembra funzionare.