2015-03-03 20 views
9

Używam Go (Golang) 1.4.2 z Gorilla WebSockets za odwrotnym proxy nginx 1.4.6. Moje WebSockets rozłączają się po około minucie od otwarcia strony. To samo zachowanie występuje w Chrome i Firefox.Gorilla WebSocket rozłącza się po minucie

Początkowo miałem problemy z połączeniem serwera i klienta z WebSockets. Potem przeczytałem, że muszę zmodyfikować moją konfigurację nginx. Oto, co mam.

server { 
    listen 80; 
    server_name example.com; 

    proxy_pass_header Server; 

    location/{ 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forward-Proto $scheme; 

     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 

     proxy_pass http://127.0.0.1:1234; 
    } 
} 

Mój kod Go w zasadzie odbija się echem z powrotem do wiadomości klienta. (Błędy pominięte dla zwięzłości). To jest moja HandleFunc.

var up = websocket.Upgrader{ 
    ReadBufferSize: 1024, 
    WriteBufferSize: 1024, 
} 

ws, _ := up.Upgrade(resp, req, nil) 
defer ws.Close() 

var s struct { 
    Foo string 
    Bar string 
} 

for { 
    ws.ReadJSON(&s) 
    ws.WriteJSON(s) 
} 

JavaScript jest również bardzo prosty.

var ws = new WebSocket("ws://example.com/ws/"); 
ws.addEventListener("message", function(evnt) { 
    console.log(JSON.parse(evnt.data)); 
}); 

var s = { 
    Foo: "hello", 
    Bar: "world" 
}; 
ws.send(JSON.stringify(s)); 

Go zgłasza websocket: close 1006 unexpected EOF. Wiem, że gdy opuszczam lub odświeżam stronę, zwracam ReadJSON, ale wydaje się, że jest to inny błąd. Ponadto niespodziewany EOF dzieje się samo po około minucie otwarcia strony.

Mam funkcję onerror w JavaScript. To wydarzenie nie jest wyzwalane, ale zamiast tego strzela z podpaleniem onclose.

Odpowiedz

26

Miałem ten sam problem, problemem jest konfiguracja nginx. Domyślnie ustawiony czas oczekiwania to 1 minuta na proxy_pass:

Składnia: proxy_read_timeout time;

Domyślnie: proxy_read_timeout 60s;

bloków: http, server, location

Zobacz http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout

w moim przypadku mam zwiększony limit czasu do 10 godzin:

proxy_read_timeout 36000s;

+0

tej pory tak dobrze, nigdy nie wiadomo, kiedy koleś podzieli się z tobą pewną mądrością. Dzięki stary! –

+0

@MaxYari The Dude Abides –