2012-02-21 10 views
7

Quindi ho cercato di farlo funzionare 2 giorni e sono bloccato. Questa è la prima volta che configuro un server per i binari che utilizza NodeJS + Socket IO. Sono un noob con NGINX e Unicorn. Fondamentalmente la parte NodeJS + SocketIO della mia app spingerà i messaggi agli utenti che sono connessi alla mia app. Questo è il mio nginx.confConfigurazione NGINX per funzionare con Socket.IO

server{ 
    listen 80 default; 
    root /home/deployer/saigon/public; 
    try_files $uri/index.html $uri @unicorn; 

    location /sockets { 
     proxy_pass http://localhost:3210; 
    } 

    location @unicorn { 
     proxy_pass http://localhost:3000; 
    } 
} 

E nella mia production.rb, ho configurato l'url cui l'utente dovrà inviare il messaggio per ricevere un messaggio/da

SOCKET_IO_URL ='http://localhost:8080/sockets 

Perché 8080? Uso Vagrant per inoltrare 8080 -> 80

Ho provato ad accedere a http://localhost:8080/sockets e sono riuscito a ottenere il messaggio di benvenuto del socket. Ho guardato il mio log del server NodeJS e stava ricevendo messaggi ok. Tuttavia, quando si tratta di trasmettere ..... semplicemente non lo fa. Qualcuno ha mai avuto questo tipo di app per lavorare con il set up che sto cercando di fare? Dovrei semplicemente andare con Apache + Unicorn?

'

risposta

12

risposta Aggiornato

Ho finalmente trovato un modo per ottenere questo lavoro. Non è affatto ovvio, ma quando si ospita socket.io su una sottocartella, NON si usa la sottocartella nell'istruzione connect. Questo è quello che stavo facendo prima e il cliente non ha mai ricevuto una risposta.

non funziona

<script src="/test/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080/test/', {resource:'test/socket.io'}); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

http://localhost:8080/test/ Questa è la parte che sta gettando le cose fuori. Ciò crea uno spazio dei nomi per il socket locale che il lato server non rispetta. Quindi il client invia il messaggio nello spazio dei nomi '/ test /', ma le risposte del server stanno andando a un segnaposto vuoto '' in modo che il client non ottenga mai i messaggi. La soluzione alternativa è rimuovere semplicemente '/ test /' e assicurarsi di utilizzare la variabile risorsa sul client e sul server.

Funzionamento!

<script src="/test/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080', {resource:'test/socket.io'}); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

Spero che questo aiuta a far funzionare le cose da parte vostra.

risposta originale

Non è un problema con la configurazione, si tratta di un problema di socket.io non voler lavorare sulla sottocartella. Scommetto che sarebbe disposta a farlo se lasciate cadere/le prese il vostro esempio funzionerebbe bene. Mi sono imbattuto nello stesso identico problema quando si utilizzava http-node-proxy cercando di ospitare connessioni socket.io su sottocartelle. C'è stato un bug creato qualche tempo fa, ma è stato chiuso e non è mai stato risolto.

https://github.com/LearnBoost/socket.io-client/issues/185

https://github.com/LearnBoost/socket.io/issues/320

io sono ancora alla ricerca di una soluzione pure, ma ho la sensazione che sto andando a rimboccarsi le maniche e scavare nel codice stesso.

+0

quindi praticamente presa/presa.io devo rimanere nella cartella principale quindi .... il che significa che devo sapere quale richiesta sta andando a rotaie e quale sta andando a socket io quando raggiunge root? = ___ = argh – denniss

+0

Per ora si. Se possibile, puoi utilizzare invece un percorso sottodominio. http://socket.domain.com/. Questo non ha funzionato per me perché non volevo spendere più denaro su un certificato SSL per un sottodominio. –

+0

@denniss Ho aggiornato la mia risposta con una soluzione alternativa. Continuo a scavare per capire se questo è il disegno o un bug da correggere. –

Problemi correlati