2017-05-31 5 views
1

Ich habe nginx läuft auf localhost statische html/css/js-Dateien dienen. Er stellt einem Remote-Server die erforderlichen RESTful-Datenbankdienste zur Verfügung. Ich muss auch Nginx einrichten, um einen entfernten WebSocket-Server zu proxy, aber mit allen Versuchen kläglich versagt.Nginx-Proxy für Javascript WebSocket-Client

Der Javascript-Client funktioniert, wenn ich die WebSocket-Server-URL wie folgt codieren:

socket = new WebSocket("ws://50.29.123.83:9030/something/socket"); 

Offensichtlich nicht eine optimale Lösung, und ich sollte location.host und ein Proxy an die gleiche Stelle zu erhalten, verwenden können . Ich konfigurierte nginx mit den folgenden:

http { 
    ... 
    upstream websocket { 
    server 50.29.123.83:9030; 
    } 
} 

sever { 
    ... 
    location /the_socket/ { 
     proxy_pass http://websocket; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
    } 
} 

Dann wird der Client-Code aktualisiert:

socket = new WebSocket("ws://" + location.host + "/the_socket/something/socket"); 

Dies schlägt mit dem folgenden Fehler:

WebSocket connection to 'ws://localhost/the_socket/something/socket' failed: Error during WebSocket handshake: Unexpected response code: 404

Was mache ich falsch?

  • ip & Portnummern geändert, um die unschuldigen
+0

Es sieht so aus, als würde 'location.host' auf' localhost' verweisen, was wahrscheinlich auf die lokale nginx-Instanz verweist, aber wenn sie dasselbe sind, dann gibt es auch das Problem, dass 'location.host' auch nicht die Port in der URL –

+0

location.host verweist auf localhost, wo das lokale nginx ausgeführt wird. Der Port wird im Proxy-Pass über die Upstream-Server-Deklaration angegeben. – Hilo

+0

Sie greifen auf den Remote-Server mit '/ the_socket/sound/socket' zu, da Sie nicht versucht haben, das Präfix zu entfernen. –

Antwort

1

Ihre Proxy Statement zu schützen unmodifizierten den URI an den Upstream-Server übergeben. Das ist der Text /the_socket wird immer noch an den Anfang des URI angehängt.

Wenn Sie möchten, dass proxy_pass den URI ändert und den Wert location entfernt, fügen Sie der proxy_pass-Anweisung einen URI hinzu. Zum Beispiel:

location /the_socket/ { 
    proxy_pass http://websocket/; 
    ... 
} 

Weitere Informationen finden Sie unter this document.

+0

Danke Richard! – Hilo