WebSocket 连接建立时出错:net::ERR_CONNECTION_CLOSED

问题描述 投票:0回答:2

当我尝试与我的服务器建立

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,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 服务器?

node.js apache websocket https
2个回答
14
投票

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

这是我的不安全 WebSocket 服务器的安全版本,使用来自 node.js 的“ws”。

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');
});

2
投票

我遇到了类似的问题,结果我使用的是 CloudFlare,它只允许非常特定的端口通过。

于是运行在3000端口的meteor立刻就被屏蔽了。

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

但是,最终我关闭了 Meteor 部署上的套接字。看来并没有影响性能。祝你好运,

四年后更新哈哈

因此,我们使用 Apache2 并侦听端口 80 上的域,但在本例中,我们将获取端口 80 流量并将其重定向到本地主机端口 3020。它实际上可以是任何端口。希望这可以帮助!如果您想看的话,请访问 www.StarLordsOnline.com :)

<VirtualHost *:80>
ServerAdmin [email protected]
ServerName starlordsonline.com
ServerAlias www.starlordsonline.com

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://localhost:3020%{REQUEST_URI} [P]

ProxyRequests off

<Proxy *>
        Order deny,allow
        Allow from all
</Proxy>

<Location />
        ProxyPass http://localhost:3020/
        ProxyPassReverse http://localhost:3020/
</Location>

© www.soinside.com 2019 - 2024. All rights reserved.