关于nginx:一分钟后,Gorilla WebSocket断开连接

Gorilla WebSocket disconnects after a minute

我将Go(Golang)1.4.2和Gorilla WebSockets一起使用在nginx 1.4.6反向代理后面。 打开页面大约一分钟后,我的WebSocket断开连接。 在Chrome和Firefox上也会发生相同的行为。

最初,我在使用WebSockets连接服务器和客户端时遇到问题。 然后,我读到我需要调整我的nginx配置。 这就是我所拥有的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
    }
}

我的Go代码基本上是在回显客户的消息。 (为简洁起见,省略了错误)。 这是我的HandleFunc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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也非常简单。

1
2
3
4
5
6
7
8
9
10
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正在报告websocket: close 1006 unexpected EOF。 我知道当我离开或刷新页面ReadJSON时会返回EOF,但这似乎是一个不同的错误。 同样,打开页面大约一分钟后,意外的EOF也会自行发生。

我在JavaScript中有一个onerror函数。 该事件不会触发,但是onclose会触发。


我有同样的问题,问题是nginx配置。 默认情况下,proxy_pass的读取超时为1分钟:

Syntax: proxy_read_timeout time;

Default: proxy_read_timeout 60s;

Context: http, server, location

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

就我而言,我已将超时时间增加到10小时:

proxy_read_timeout 36000s;