# 日報(2022-04-10) WebSocket が open して 50秒後に close してしまう時

# はじめに

掲題の件、こんな感じで

12時34分37秒235 に open した WebSocket が 12時35分27秒236に close と、必ず 50秒後 に、しかも reason が''で、さらに code も1006と、まさに謎のclose に悩まされているあなた

60秒みたいなキリのいい秒数ならともかく 50秒という半端な秒数で切れちゃうところも不気味ですよね

# 原因

もしかして WebSocket のサーバーに Melody (opens new window) を使っていて、さらに reverse proxy に HAProxy (opens new window) を使ってたりしませんか?

# Haproxy の timeout tunnel

Haproxy で Websocket を proxy する時、timeout tunnel (opens new window) というパラメータがあって、これのデフォルトが 50秒 なんだそうです

# Melody の Ping Period

で、keep alive のための Melody の Ping Period の設定がこちら (opens new window) で、

PingPeriod:        (60 * time.Second * 9) / 10,

ええと、54秒 ですね

# 直し方

HAProxy の timeout tunnel を54秒以上に増やすか、Melody の Ping Period を50秒以下に縮めるかどっちかですね

HAProxy の timeout tunnel の設定変更の仕方はあちこちにありますので、ここでは Melody の設定を変更してみます。Melody の Config は Config ファイルなどで変更する方法がないので、ソースをいじります

Melody はもう何年もメンテされてない (opens new window) らしいので、たぶん当分、version は v1.0.0-20170518105555-d52139073376のままだとおもうので、~/go/pkg/mod/gopkg.in/olahol/melody.v1@v1.0.0-20170518105555-d52139073376/config.go

PingPeriod:        (60 * time.Second * 9) / 10,

PingPeriod:        (60 * time.Second * 8) / 10,

とかでも 48秒 なのでいいのですが

PingPeriod:        (60 * time.Second * 4) / 10,

にしておくと 24秒 なので一回ぐらい ping を受け残っても timeout しないのでいいかもしれません


Last Updated: 7/10/2022, 2:15:32 PM