2016-01-27 2 views
8

Я получаю эту ошибку, когда я пытаюсь установить wss соединение с моим сервером:WebSocket Ошибка установления соединения: Net :: ERR_CONNECTION_CLOSED

подключение WebSocket к 'WSS: // MYDOMAIN: 3000 /' не удалось Ошибка в создании соединения: сетка :: ERR_CONNECTION_CLOSED

в настоящее время я имею установку apache2 конфигурации виртуального хоста для прослушивания запросов на порт 443 и 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> 

Как вы можете видеть, он использует JkMount для передачи запроса Tomcat, который правильно обслуживает веб-страницу как на HTTP, так и на HTTPS.

Когда я посещаю сайт, используя протокол HTTP на порту 80, соединение WebSocket может быть выполнено с использованием протокола ws.

Когда я посещаю сайт с использованием протокола HTTPS на порту 443, сайт обслуживается правильно, но соединение с WebSocket не производится с использованием wss.

Я использую «WS» node.js модуль для обеспечения сервера 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'); 
}); 

Почему я не смог успешно подключиться к серверу WebSocket с использованием протокола wss над https?

ответ

9

Проблема заключалась в том, что я не настраивал сервер WebSocket для https/wss.

Вот защищенная версия моего небезопасного сервера WebSocket, использующая «ws» from 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

Где я могу это настроить? Я новичок в Node.JS и испытываю эту проблему. – Andy

+0

Вы должны настроить свой веб-сервер для шифрования с открытым ключом и предоставить информацию о ключах и сертификатах. http://chrismepham.co.uk/blog/guide/how-to-convert-a-web-application-from-http-to-https/ – crm

0

У меня была аналогичная проблема, оказалось, что я использовал CloudFlare, который пропускает только очень специфические порты.

Таким образом, метеорит, работающий на порте 3000, был немедленно заблокирован.

Реконфигурирование настроек обратного прокси-сервера и запуск Meteor на разрешенном порту решает мою проблему.

Но, в конце концов, я отключил розетки на моем развертывании Метеор. Похоже, что это не повлияло на производительность. Удачи,