Горилла 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;