Горилла WebSocket отключается через минуту
Я использую Go (Golang) 1.4.2 с Gorilla WebSockets за обратным прокси-сервером nginx 1.4.6. Мои 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
возвращает EOF
, но это, похоже, другая ошибка. Кроме того, неожиданный EOF происходит сам по себе примерно через минуту после открытия страницы.
у меня есть onerror
функция в JavaScript. Это событие не срабатывает, но onclose
вместо пожаров.
1 ответов
у меня была та же проблема, проблема в конфиге nginx. Значение по умолчанию 1 минута таймаут для proxy_pass
:
синтаксис: время, когда;
по умолчанию: proxy_read_timeout 60s;
контекст: http, сервер, местоположение
см http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout
в моем случае я увеличил таймаут до 10 часы работы:
proxy_read_timeout 36000s;