Gorilla WebSocket 一分钟后断开连接
Gorilla WebSocket disconnects after a minute
我在 nginx 1.4.6 反向代理后面使用 Go (Golang) 1.4.2 和 Gorilla WebSockets。打开页面大约一分钟后,我的 WebSockets 断开连接。同样的行为发生在 Chrome 和 Firefox。
起初,我在使用 WebSockets 连接服务器和客户端时遇到了问题。然后,我读到我需要调整我的 nginx 配置。这就是我的。
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
.
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也很简单。
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
returns 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;
我在 nginx 1.4.6 反向代理后面使用 Go (Golang) 1.4.2 和 Gorilla WebSockets。打开页面大约一分钟后,我的 WebSockets 断开连接。同样的行为发生在 Chrome 和 Firefox。
起初,我在使用 WebSockets 连接服务器和客户端时遇到了问题。然后,我读到我需要调整我的 nginx 配置。这就是我的。
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
.
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也很简单。
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
returns EOF
,但这似乎是一个不同的错误。此外,意外的 EOF 在打开页面大约一分钟后自行发生。
我在 JavaScript 中有一个 onerror
函数。该事件不会触发,但 onclose
会触发。
我遇到了同样的问题,是nginx配置的问题。对于 proxy_pass
:
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;