web-dev-qa-db-ja.com

接続確立でのWebSocketエラー:net :: ERR_CONNECTION_CLOSED

サーバーとのwss接続を確立しようとすると、次のエラーが発生します。

'wss:// mydomain:3000 /'へのWebSocket接続に失敗しました:接続確立中にエラーが発生しました:net :: ERR_CONNECTION_CLOSED

現在、ポート443および80でリクエストをリッスンするためのApache2仮想ホスト構成セットアップがあります。

<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を使用して、HTTPとHTTPSの両方でWebページを正しく提供するTomcatに要求を渡します。

ポート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サーバーに正常に接続できないのはなぜですか?

10
crmepham

問題は、https/wss用にWebSocketサーバーを構成していなかったことです。

これは、node.jsの「ws」を使用した安全でないWebSocketサーバーの安全なバージョンです。

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

私は同様の問題を抱えていました、私は非常に特定のポートのみを通過させるCloudFlareを使用していたことがわかりました。

そのため、ポート3000で実行されている流星は即座にブロックされました。

リバースプロキシ設定を再構成し、許可されたポートでMeteorを実行すると、問題が解決しました。

しかし、結局、Meteorデプロイのソケットをオフにしました。パフォーマンスに影響はないようです。幸運を、

4年後のLOLを更新

したがって、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>
2
Andy