Je reçois cette erreur lorsque je tente d'établir une connexion wss
avec mon serveur:
La connexion WebSocket à 'wss: // mydomain: 3000 /' a échoué: erreur lors de l'établissement de la connexion : Net :: ERR_CONNECTION_CLOSED
J'ai actuellement une configuration de l'hôte virtuel Apache2 pour écouter les demandes sur les ports 443 et 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>
Comme vous pouvez le constater, il utilise JkMount pour transmettre la demande à Tomcat, qui sert correctement la page Web sur HTTP et HTTPS.
Lorsque je visite le site en utilisant le protocole HTTP sur le port 80, une connexion WebSocket peut être établie en utilisant le protocole ws
.
Lorsque je visite le site à l'aide du protocole HTTPS sur le port 443, le site est correctement servi, mais aucune connexion WebSocket n'est établie à l'aide de wss
.
J'utilise le module "ws" node.js pour fournir le serveur WebSocket:
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');
});
Pourquoi ne puis-je pas réussir à me connecter au serveur WebSocket à l'aide du protocole wss
sur https
?
Le problème était que je n'avais pas configuré le serveur WebSocket pour https/wss.
Voici la version sécurisée de mon serveur WebSocket non sécurisé utilisant "ws" à partir de 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');
});
J'avais un problème similaire, en utilisant CloudFlare qui n'autorise que des ports très spécifiques.
Donc, météore fonctionnant sur le port 3000 a été instantanément bloqué.
La reconfiguration de mes paramètres de proxy inverse et l'exécution de Meteor sur un port autorisé ont résolu mon problème.
Mais, au bout du compte, j’ai éteint les prises sur mon déploiement Meteor. Cela ne semble pas avoir affecté les performances. Bonne chance,