2016-01-27 10 views
8

Ich erhalte diese Störung, wenn ich eine wss Verbindung mit meinem Server herzustellen versuchen:WebSocket Fehler bei Verbindungsaufbau: net :: ERR_CONNECTION_CLOSED

WebSocket-Verbindung zu 'WSS: // mydomain: 3000 /' ist fehlgeschlagen : Fehler in Verbindungsaufbau: net :: ERR_CONNECTION_CLOSED

ich apache2 virtuellen Host-Konfiguration Setup haben derzeit zu hören für Anfragen auf Port 443 und 80:

<VirtualHost *:80> 
     ServerName otherdomainname.co.uk 
     ServerAlias www.otherdomainname.co.uk 

     RewriteEngine On 
     RewriteRule ^/(.*)$ /app/$1 [l,PT] 

     JkMount /* worker2 

</VirtualHost> 

<VirtualHost _default_:443> 
     ServerName otherdomainname.co.uk 
     ServerAlias www.otherdomainname.co.uk 

     RewriteEngine On 
     RewriteRule ^/(.*)$ /app/$1 [l,PT] 

     SSLEngine On 
     SSLCertificateFile /etc/apache2/ssl/apache.crt 
     SSLCertificateKeyFile /etc/apache2/ssl/apache.key 

     <Location /> 
     SSLRequireSSL On 
     SSLVerifyClient optional 
     SSLVerifyDepth 1 
     SSLOptions +StdEnvVars +StrictRequire 
     </Location> 

     JkMount /* worker2 

</VirtualHost> 

Wie Sie sehen können, verwendet JkMount die Anforderung an Tomcat, die die Webseite sowohl auf HTTP als auch auf HTTPS korrekt bedient.

Wenn ich die Website mit dem HTTP-Protokoll auf Port 80 besuche, kann eine WebSocket-Verbindung mit dem Protokoll ws hergestellt werden.

Wenn ich die Site mit dem HTTPS-Protokoll auf Port 443 besuche, wird die Site korrekt bedient, aber es wird keine WebSocket-Verbindung mit wss hergestellt.

Ich bin mit dem „ws“ node.js Modul den WebSocket-Server zur Verfügung zu stellen:

var WebSocketServer = require('ws').Server 
    , wss = new WebSocketServer({ port: 3000 }), 
    fs = require('fs'); 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
    console.log('received: %s', message); 

    ws.send(message); 
    ws.send('something'); 
}); 

Warum bin ich auf den WebSocket-Server erfolgreich eine Verbindung mit dem wss Protokoll über https nicht in der Lage?

Antwort

9

Das Problem war, dass ich den WebSocket-Server für https/wss nicht konfiguriert habe.

Hier ist die sichere Version meines unsicheren WebSocket-Servers mit "ws" von node.js.

var WebSocketServer = require('ws').Server, 
    fs = require('fs'); 


var cfg = { 
     ssl: true, 
     port: 3000, 
     ssl_key: '/path/to/apache.key', 
     ssl_cert: '/path/to/apache.crt' 
    }; 

var httpServ = (cfg.ssl) ? require('https') : require('http'); 

var app  = null; 

var processRequest = function(req, res) { 

    res.writeHead(200); 
    res.end("All glory to WebSockets!\n"); 
}; 

if (cfg.ssl) { 

    app = httpServ.createServer({ 

     // providing server with SSL key/cert 
     key: fs.readFileSync(cfg.ssl_key), 
     cert: fs.readFileSync(cfg.ssl_cert) 

    }, processRequest).listen(cfg.port); 

} else { 

    app = httpServ.createServer(processRequest).listen(cfg.port); 
} 

var wss = new WebSocketServer({ server: app }); 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
    console.log('received: %s', message); 

    ws.send(message); 

    }); 

    ws.send('something'); 
}); 
+1

Wo konfiguriere ich das? Ich bin neu in Node.JS und habe dieses Problem. – Andy

+0

Sie müssen Ihren Webserver für die Verschlüsselung mit öffentlichem Schlüssel einrichten und die Schlüssel- und Zertifikatsinformationen bereitstellen. http://chrismepham.co.uk/blog/guide/how-to-convert-a-web-application-from-http-to-https/ – crm

0

Ich hatte ein ähnliches Problem, stellt sich heraus, dass ich CloudFlare verwendete, die nur sehr spezifische Ports durchlässt.

So Meteor auf Port 3000 läuft wurde sofort blockiert.

Das Rekonfigurieren meiner Reverse Proxy-Einstellungen und das Ausführen von Meteor an einem erlaubten Port löste mein Problem.

Aber am Ende habe ich Sockets auf meinem Meteor deploy ausgeschaltet. Es scheint die Leistung nicht beeinträchtigt zu haben. Viel Glück,

Verwandte Themen