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>`))
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
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