2014-03-19 15 views
16

Ich habe versucht, Ratchet.io über SSL (dieses Problem: php ratchet websocket SSL connect?) zu laufen.Ratchet + nginx + SSL/sichere Websocket

Mein Webserver läuft auf myhost.mobi, und ich habe einen separaten virtuellen Host für den Websocket-Dienst "wws.myhost.mobi" erstellt.

Meine Web-Buchse:

$webSock = new React\Socket\Server($loop); 
$webSock->listen(8080, '0.0.0.0'); 
$webServer = new Ratchet\Server\IoServer(
    new Ratchet\Http\HttpServer(
     new Ratchet\WebSocket\WsServer(
      new Ratchet\Wamp\WampServer(
       $pusher 
      ) 
     ) 
    ), 
    $webSock 
); 

Meine nginx config (Ich bin auf nginx 1.5.8):

upstream websocketserver { 
     server localhost:8080; 
} 

server { 
    server_name wss.myapp.mobi; 

    listen 443; 
    ssl on; 
    ssl_certificate /etc/ssl/myapp-mobi-ssl.crt; 
    ssl_certificate_key /etc/ssl/myapp-mobi.key; 

    access_log /var/log/wss-access-ssl.log; 
    error_log /var/log/wss-error-ssl.log; 
    location/{ 
       proxy_pass http://websocketserver; 
       proxy_http_version 1.1; 
       proxy_set_header Upgrade $http_upgrade; 
       proxy_set_header Connection "upgrade"; 
       proxy_set_header Host $host; 

       proxy_set_header X-Real-IP $remote_addr; 
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
       proxy_set_header X-Forwarded-Proto https; 
       proxy_read_timeout 86400; # neccessary to avoid websocket timeout disconnect 
       proxy_redirect off; 
     } 
} 

Mein clientseitige Skript: So

var conn = new ab.Session('wss://wss.myapp.mobi', function(o) { 

    // ... 

}, function() { 
    console.warn('WebSocket connection closed'); 
}, { 
    skipSubprotocolCheck: true 
}); 

Wenn ich die Seite in Firefox lade, sehe ich eine ausgehende Verbindung zu wss: //wss.myapp.mobi: 8080 /, die hängt (der Spinner) und niemals beendet wird oder stirbt. Ich sehe keine Spur von Anfragen, die im Backend in den Protokollen eintreffen.

Was fehlt mir dort?

Danke!

EDIT Ich habe gemerkt, dass ich zu WSS werden Verbindungs ​​sollte: //wss.myapp.mobi, aber jetzt "101 Switching Protocols" Status Ich erhalte.

EDIT 2 Alles funktioniert jetzt mit der obigen Konfiguration. Der "101 Switching Protocols" Status stellt sich als normale Nachricht heraus. PROBLEM GELÖST!

+3

Sie mir wirklich geholfen, von Browser-Client zugegriffen werden. Ich war nicht in der Lage, Websockets mit SSL in Nginx zu arbeiten. Stellt sich heraus, dass ich den Proxy_set_header X-Forwarded-Proto https fehlte; Richtlinie in der Konfiguration - und Ihre Frage hat mich dazu gebracht, es hinzuzufügen. Danke! – Rubinsh

+0

Diese Frage ist gelöst (siehe Bearbeiten), aber die Lösung wird nicht erläutert. –

+0

Konnten Sie die ausführliche Lösung als Antwort posten? –

Antwort

0

Durch Frage Editierhistorie Überprüfung ist es klar, dass die Konfiguration in der Frage richtig war, temuri versucht, vom Client mit dem Port in Block

upstream websocketserver { 
     server localhost:8080; 
} 

aber dieser Code gesetzt zu verbinden erzählt Nginx Es gibt einen Tcp-Server, der auf Port 8080 läuft, stellt ihn als websocketserver Alias ​​dar, aber der laufende Server ist nicht öffentlich zugänglich.

die unter Konfiguration prüfen,

server { 
    server_name wss.myapp.mobi; 

    listen 443; 
    ssl on; 
    ssl_certificate /etc/ssl/myapp-mobi-ssl.crt; 
    ssl_certificate_key /etc/ssl/myapp-mobi.key; 

    access_log /var/log/wss-access-ssl.log; 
    error_log /var/log/wss-error-ssl.log; 
    location/{ 
       proxy_pass http://websocketserver; 
       proxy_http_version 1.1; 
       proxy_set_header Upgrade $http_upgrade; 
       proxy_set_header Connection "upgrade"; 
       proxy_set_header Host $host; 

       proxy_set_header X-Real-IP $remote_addr; 
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
       proxy_set_header X-Forwarded-Proto https; 
       proxy_read_timeout 86400; # neccessary to avoid websocket timeout disconnect 
       proxy_redirect off; 
     } 
} 

diese Konfiguration die Domäne wss.myapp.mobi auf Port 443 ermöglicht ssl und proxy ing die Anforderungen an den lokalen websocket Server über proxy_pass Richtlinie Handhabung, Rest-Richtlinien sind für den Anschluss Upgrades bindet.

So ist der websocket Server kann mit dieser Frage mit

// connect through binded domain 
// instead of wss.myapp.mobi:8080 which will not work 
var url = 'wss://wss.myapp.mobi'; 
Verwandte Themen