2014-02-28 10 views
5

Ich habe Probleme bekommen go.net/websocket, um hinter Nginx arbeiten. Es funktioniert, wenn auf die Anwendung direkt zugegriffen wird, aber mit Nginx, bekomme ich einen EOF-Fehler von Receive.Kann nicht go.net/websocket arbeiten hinter Nginx

Was mache ich falsch?

Nginx Version: 1.5.10

Dies ist meine nginx-Konfiguration.

location /wstest/ { 
    proxy_pass http://localhost:7415/; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade "websocket"; 
    proxy_set_header Connection "Upgrade"; 
    proxy_buffering off; 
} 

Go Code:

func main() { 
    http.HandleFunc("/", home) 
    http.Handle("/sock", websocket.Handler(pingpong)) 

    http.ListenAndServe(":7415", nil) 
} 

func home(w http.ResponseWriter, r *http.Request) { 
    homeTmpl.Execute(w, nil) 
} 

func pingpong(conn *websocket.Conn) { 
    var msg string 
    if err := websocket.Message.Receive(conn, &msg); err != nil { 
     log.Println("Error while receiving message:", err) 
     return 
    } 

    if msg == "ping" { 
     websocket.Message.Send(conn, "pong") 
    } 
} 

var homeTmpl = template.Must(template.New("home").Parse(` 
<!doctype html> 
<html> 
<head> 
<title>WS Test</title> 
<script> 
    var path = window.location.pathname; 
    var wsURL = "ws://" + window.location.host + path.substring(0, path.lastIndexOf('/')) + "/sock"; 
    var ws; 

    document.addEventListener("DOMContentLoaded", function() { 
     ws = new WebSocket(wsURL); 
     ws.onopen = function() { 
     ws.send("ping"); 
    }; 

    ws.onmessage = function(event) { 
     document.getElementById("status").innerHTML = "Received: " + String(event.data); 
    }; 
}) 
</script> 
</head> 
<body> 
<span id="status">Pinging...</span> 
</body> 
</html>`)) 
+0

Ohne Ihre Konfiguration zu testen, das einzige, was ich vorschlagen kann, ist zu ändern "Upgrade" zu "upgrade" in 'proxy_set_header Verbindung" Upgrade ";'. Es ist möglich, dass Groß- und Kleinschreibung beachtet wird (obwohl dies laut https://tools.ietf.org/html/rfc6455 nicht der Fall sein sollte). Vielleicht möchten Sie auch den 'Host'-Header mit' proxy_set_header Host $ host; 'hinzufügen, aber ich bin mir nicht sicher, ob das erforderlich ist. Ein Beispiel finden Sie unter http://nginx.org/en/docs/http/websocket.html. – Intermernet

+0

Eigentlich, nach https://code.google.com/p/go/source/browse/websocket/hybi.go?repo=net#428 das Websocket-Paket ist nicht Groß-und Kleinschreibung, so sollte das Problem nicht sein mit den Headern. Wird versuchen, das Problem zu replizieren. – Intermernet

Antwort

9

Dies ist die Konfiguration, die ich verwende, es funktioniert OK:

server { 
    listen 0.0.0.0:20007;  
    index index.html; 

    root /full/path/to/site; 

    # pass the request to the node.js server with the correct headers 
    location/{ 

     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://your_app/; 
     proxy_redirect off; 

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

Ändern von 'proxy_set_header Upgrade" websocket ";' zu 'proxy_set_header Upgrade $ http_upgrade;' hat funktioniert. –

Verwandte Themen