Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gorilla WebSocket disconnects after a minute

I'm using Go (Golang) 1.4.2 with Gorilla WebSockets behind an nginx 1.4.6 reverse proxy. My WebSockets are disconnecting after about a minute of having the page open. Same behavior occurs on Chrome and Firefox.

At first, I had problems connecting the server and client with WebSockets. Then, I read that I needed to tweak my nginx configuration. This is what I have.

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;
    }
}

My Go code is basically echoing back the client's message. (Errors omitted for brevity). This is my 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)
}

The JavaScript is pretty simple as well.

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 is reporting websocket: close 1006 unexpected EOF. I know that when I leave or refresh the page ReadJSON returns EOF, but this appears to be a different error. Also, the unexpected EOF happens by itself after about a minute of having the page open.

I have an onerror function in JavaScript. That event doesn't fire, but onclose fires instead.

like image 804
425nesp Avatar asked Mar 03 '15 09:03

425nesp


People also ask

Why does my WebSocket disconnect?

In some cases, however, the client or the server may not be aware that the network connection has become stale. For example, if a network cable is unplugged, a network interface is shut down, or an intermediate component in the connection (such as a proxy server) becomes disconnected.

How many Websockets can go handle?

The theoretical limit is 65k connections per IP address but the actual limit is often more like 20k, so we use multiple addresses to connect 20k to each (50 * 20k = 1 mil). I then run the web server as root by typing sudo -i followed by ulimit -n 1024000 and then node examples/WebSocket.

What is Gorilla WebSocket?

GitHub - gorilla/websocket: A fast, well-tested and widely used WebSocket implementation for Go. Product. Actions. Copilot. Packages.


1 Answers

I had the same issue, the problem is the nginx configuration. It defaults to a 1 minute read timeout for proxy_pass:

Syntax: proxy_read_timeout time;

Default: proxy_read_timeout 60s;

Context: http, server, location

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

In my case I've increased the timeout to 10 hours:

proxy_read_timeout 36000s;

like image 146
Not_a_Golfer Avatar answered Sep 22 '22 23:09

Not_a_Golfer