2016-02-29 44 views
5

In precedenza avevo uno script Socket.io in esecuzione su http, ma l'aggiornamento a https l'ha interrotto. Ho installato il certificato sul server ma senza fortuna. Il codice per la configurazione del server è:Errore gateway errato utilizzando Socket.io Node.js su SSL

var https = require('https'), 
    fs = require('fs'); 

var options = { 
    key: fs.readFileSync('/etc/nginx/ssl/default/54082/server.key'), 
    cert: fs.readFileSync('/etc/nginx/ssl/default/54082/server.crt') 
}; 
var app = https.createServer(options); 

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

Tuttavia nel browser web pagina non riesce a collegarsi ad esso e la console mostra una risposta the server responded with a status of 502 (Bad Gateway).

Qualche idea su se la sceneggiatura è sbagliata? O forse qualcosa nel setup di Nginx?

Molte grazie

Edit: Il codice front-end che sto utilizzando per la connessione:

<script type="text/javascript" src="https://socket.example.com/socket.io/socket.io.js"></script> 
<script> 
var io = io('https://socket.example.com', { secure: true }); 
</script> 

Modifica :: Nginx config:

# FORGE CONFIG (DOT NOT REMOVE!) 
include forge-conf/socket.example.co.uk/before/*; 

server { 
    listen 443 ssl; 
    server_name socket.example.co.uk; 
    root /home/forge/socket.example.co.uk; 

    # FORGE CONFIG (DOT NOT REMOVE!) 
    include forge-conf/socket.example.co.uk/server/*; 

    location/{  
     proxy_pass https://socket.example.co.uk:3000; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection 'upgrade'; 
     proxy_set_header Host $host; 
     proxy_cache_bypass $http_upgrade; 
    } 

} 

# FORGE CONFIG (DOT NOT REMOVE!) 
include forge-conf/socket.example.co.uk/after/*; 
+1

Stai passando {garantire: true} durante la connessione al server? http://stackoverflow.com/questions/6599470/node-js-socket-io-with-ssl –

+0

non è necessario eseguire il proxy su node.js tramite nginx. la porta è aperta, quindi connettendosi con 'io.connect (': ', {secure: true}); 'dal client è tutto ciò che devi fare per iniziare. non è possibile eseguire il proxy tramite nginx (e non è necessario dal momento che il nodo si collega a tutte le interfacce e il dominio viene instradato al proprio ip: porta comunque a causa della configurazione DNS). ho letteralmente aggiornato il mio socket io a https ieri senza problemi. – r3wt

+0

@ r3wt Quindi stai dicendo che il dominio dovrebbe essere qualcosa di diverso? Cosa dovrebbe essere? Sto usando il codice 'var io = io ('https://socket.example.com/socketio/socketio.js', {secure: true});' – samiles

risposta

3
  1. make sicuro che il tuo dominio punta al tuo server.
  2. assicurati che un blocco del server nginx sia in esecuzione per il tuo dominio con ssl abilitato.
  3. rimuovere qualsiasi blocco di posizione dalla configurazione nginx che tenta di eseguire il proxy sulla porta su cui si sta eseguendo il server socket.io.
  4. assicurati che il tuo certificato SSL sia valido.
  5. connettersi con io.connect() invece del modo in cui si sta facendo. lasciare fuori la parte del protocollo dell'URL (https://).
  6. utilizzare sudo killall -9 node dalla riga di comando per terminare tutti i processi di zombi che potrebbero essere persistenti e associati alla porta. questo a volte capita con socket.io quando non riesce a spegnersi correttamente.

esempio dal mio codice:

var socket = io.connect('dev.somedomain.com:3000',{secure:true}); 

esempio server dal mio dominio:

var fs = require('fs'), 
    https = require('https'), 
    config = JSON.parse(fs.readFileSync('./config.json','utf-8')), 
    serverOpts = { 
     key: fs.readFileSync(config.server.key), 
     cert: fs.readFileSync(config.server.cert) 
    }, 
    server = https.createServer(serverOpts,function(req,res){}), 
    io = require('socket.io').listen(server); 

io.on('connection', function(socket){ 
    console.log('houston, we have lift off'); 
}); 

server.listen(config.port, function(){ 
    log('listening on *:%d',config.port); 
}); 

ovviamente sto leggendo il percorso per il mio certificato e file chiave da un config. file json ma dovresti avere l'idea giusta?

+0

Non ho avuto fortuna con nulla di tutto ciò. Grazie comunque per il tuo aiuto. Forse c'è qualcos'altro nella mia configurazione da qualche parte per rompere qualcosa ... Sto solo rinunciando ora ... – samiles

2

Il 502 (Gateway errato) indica che il servizio nginx ha tentato di contattare il server proxy ma non è riuscito. La riga in nginx config

proxy_pass https://socket.example.co.uk:3000; 

sembra essere il problema. Impossibile vedere dal tuo codice nodejs che viene utilizzata la porta 3000.

-2

Ho stesso problema ma con apache2, ho risolto da aggiungere questa riga al mio vhost config

SSLProxyEngine on SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off