12

nginx 1.4.6 リバース プロキシの背後にある Gorilla WebSockets で Go (Golang) 1.4.2 を使用しています。ページを開いてから約 1 分後に WebSocket が切断されます。Chrome と Firefox でも同じ動作が発生します。

最初は、サーバーとクライアントを WebSocket で接続する際に問題がありました。次に、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 は、ページを開いてから約 1 分後に自然に発生します。

私はonerrorJavaScriptで関数を持っています。そのイベントは発生しませんが、onclose代わりに発生します。

4

1 に答える 1