2015-03-14 15 views
9

Ich versuche, statische Dateien von Nginx 1.6 und Proxy-Socket-Verkehr von Node.js Web-Server mit socket.io zu dienen.Socket.io mit Nginx

Dies ist der relevante Teil der nginx.conf:

location /socket.io/ { 
      proxy_pass http://localhost:3000;  
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "Upgrade"; 
      proxy_set_header Host $host; 
     } 

Es funktioniert perfekt direkt zwischen dem Browser und Node.js, aber socket.io dauert zu lange, wenn sie mit nginx 1.6 proxied. Ein Handshaking-Protokoll benötigt zu viel Zeit, aber wenn es nicht unterbrochen wird, beginnt es nach einigen Minuten zu arbeiten.

Statische Dateien Lieferung von Nginx funktioniert einwandfrei.

Was könnte das Problem sein?

UPDATE:

ich ein bisschen den Netzwerkverkehr analysiert und festgestellt, dass die folgende Anfrage dauert etwa eine Minute (es ist genau das, wenn die Aktualisierung angefordert wird):

Sec-WebSocket-Key: LhZ1frRdl+myuwyR/T03lQ== 
Cookie: io=1-A7tpvwmoGbrSvTAAA5 
Connection: keep-alive, Upgrade 
Upgrade: websocket 
.... 

Die erwartete Antwort ist Code 101 und:

Connection: upgrade 
Sec-WebSocket-Accept: HXx3KKJadQYjDa11lpK5y1nENMM= 
Upgrade: websocket 
... 

stattdessen das br owser erhält und:

Access-Control-Allow-Credentials: true 
Access-Control-Allow-Origin: http://localhost:8888 
Connection: keep-alive 
Content-Type: application/json 
Server: nginx/1.6.2 
Transfer-Encoding: chunked 

UPDATE 2:

ich festgestellt, dass die gleiche Konfiguration perfekt auf meinem Büro-Computer arbeitet, was bedeutet, dass es Ausgabe meines Computers zu Hause ist. Wie auch immer, es wäre sehr schön festzustellen, was genau falsch läuft.

+0

Gibt es viel Unterschied in der System Konfi von zu Hause und Office-System? – tharif

Antwort

1

Jedes Beispiel, das ich gesehen habe (Nginx docs, Nginx blog) verwendet:

proxy_set_header Connection "upgrade"; 

Hinweis klein geschrieben "Upgrade". Ihr Beispiel hat ein großes "U". Vielleicht einen Versuch wert.

+0

Definitiv einen Versuch wert. Ich habe es schon gemacht, funktioniert nicht. – Aleks

0

Sie haben vielleicht vergessen, dass proxy_redirect ausgeschaltet ist;

location/{ 
      proxy_pass http://localhost:3000/; 
      include proxy_params; 
      proxy_redirect off; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "Upgrade"; 
    } 
24

In einem laufenden Server, die Konfiguration des nginx hier verwendet wird, ist:

# Requests for socket.io are passed on to Node on port 3000 
    location ~* \.io { 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-NginX-Proxy true; 

     proxy_pass http://localhost:3000; 
     proxy_redirect off; 

     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
    } 
+0

Das ist das einzige, was bei mir funktioniert hat! Vielen Dank! – GobSmack

+0

Danke "Heu Seuss", Vater Abraham, Buddha und Mutter Erde! Beachfront.Digital vielen Dank. –

+0

das funktionierte für mich perfekt .. danke :) – dip1232001