サーバーとの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サーバーに正常に接続できないのはなぜですか?
問題は、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');
});
私は同様の問題を抱えていました、私は非常に特定のポートのみを通過させる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>