连接建立中的WebSocket错误:net :: ERR_CONNECTION_CLOSED

时间:2016-01-27 11:23:54

标签: node.js apache https websocket wss

当我尝试与服务器建立wss连接时,我收到此错误:

  

与'wss:// mydomain:3000 /'的WebSocket连接失败:错误   连接建立:net :: 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上正确地提供网页。

当我在端口80上使用HTTP协议访问该站点时,可以使用ws协议建立WebSocket连接。

当我使用端口443上的HTTPS协议访问该站点时,该站点已正确提供,但未使用wss建立WebSocket连接。

我正在使用“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');
});

为什么我无法使用wss上的https协议成功连接到WebSocket服务器?

2 个答案:

答案 0 :(得分:10)

问题是我没有为https / wss配置WebSocket服务器。

这是我的不安全的WebSocket服务器的安全版本使用&#34; ws&#34;来自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 :(得分:1)

我遇到了类似的问题,事实证明我使用的CloudFlare只允许非常具体的端口通过。

因此,在3000港口运行的流星立即被阻挡。

重新配置我的反向代理设置并在允许的端口上运行Meteor解决了我的问题。

但是,最后,我关闭了Meteor部署的套接字。它似乎没有影响性能。祝你好运,