2017-10-19 55 views
0

Je configure un sous-domaine nodejs served afin que je puisse utiliser socket.io. Je sers la page sur https, et j'ai eu le serveur pour fonctionner correctement. La page est servie. Ce n'est pas le problème. Le problème est lorsque j'essaie de connecter le socket au client. J'ai essayé de résoudre cela pendant un moment, et je suis sûr qu'il y a beaucoup de gens compétents ici qui peuvent m'aider.Le serveur Nodejs https est en cours d'exécution, mais le socket ne se connecte pas (net :: ERR_CONNECTION_TIMED_OUT)

C'est mon site https://reward.cshive.com

message d'erreur que je reçois:

Error message

côté client

var socket = io.connect('https://reward.cshive.com:3000'); 

côté serveur

const https = require('https'); 
var fs = require('fs'); 
const options = { 
    key: fs.readFileSync('/etc/letsencrypt/live/reward.cshive.com/privkey.pem'), 
    cert: fs.readFileSync('/etc/letsencrypt/live/reward.cshive.com/cert.pem') 
}; 
var app = https.createServer(options, (req, res) => { 
    fs.readFile(__dirname + '/served.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     console.log('Error loading page'); 
     return res.end('Error loading page'); 

    } 
    console.log('--Connection'); 
    res.writeHead(200); 
    res.end(data); 
    }); 
}) 



var server = app.listen(3000, function(err) { 
    if (err) { 
     console.log(err); 
    } else { 
     console.log("Listening on port 3000"); 
    } 
}); 
var io = require('socket.io').listen(server); 
+0

Lorsque vous dites 'La page est servie', à quelle page voulez-vous dire? J'avais supposé initialement que vous vouliez dire la page mentionnée dans le code (du fichier 'served.html') mais je ne semble pas pouvoir y accéder. Je ne peux obtenir aucune réponse du port 3000, donc cela peut être quelque chose d'un problème de proxy ou de pare-feu à quelque chose d'aussi simple que le serveur ne fonctionne même pas. – skirtle

+0

Je suis désolé, j'aurais dû clarifier davantage. Ce que je veux dire, c'est que le fichier servi.html est servi par le noeud. Je sais cela parce que quand je ne fais pas "node server.js" je reçois une "mauvaise passerelle 502" de nginx. J'ai défini un proxy_pass pour autoriser les demandes sur le port 3000 dans mon bloc d'emplacement dans les sites disponibles. J'ajouterai la config quand je reviendrai de l'école si ça aide l'affaire. Mais, que voulez-vous dire par pare-feu. Laquelle? –

+1

Je ne l'ai pas essayé moi-même, mais il semble qu'il pourrait être utile de tout proxy via nginx plutôt que d'essayer d'exposer Node directement au monde sur le port 3000 https://gist.github.com/uorat/10b15a32f3ffa3f240662b9b0fefe706 – skirtle

Répondre

0

Essayez ceci sur votre

Mettre cela dans la section du serveur, le chemin d'accès Socket.IO pourrait me change.For il était /socket.io-client/

location /socket.io-client/ { 
      proxy_pass http://node_server; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
      proxy_redirect off; 

      proxy_buffers 8 32k; 
      proxy_buffer_size 64k; 

      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header Host $http_host; 
      proxy_set_header X-NginX-Proxy true; 
     } 

Et ce

upstream node_server { 
    server 127.0.0.1:8080; 
    keepalive 15; 
} 

font aussi

var socket = io.connect(); Vous n'avez pas besoin de spécifier l'hôte

+0

Merci, ce n'était pas exactement ce dont j'avais besoin pour résoudre le problème. Mais était certainement la majeure partie de la correction –

+0

Je suggérerais de laisser nginx gérer tous les trucs liés à SSL et le nœud js en être libre. Comme l'approche que je vois, vous finissez par faire ssl à la fois dans le nœud js et nginx. Pourrait aussi bien le faire nginx. –

+0

Eh bien, j'ai essayé de créer un serveur http dans nodejs. Mais le navigateur refusera de charger les ressources, car elles seront marquées comme dangereuses. –