# 日報(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) というパラメータがあります
timeout の tunnel ってイミフですが、このパラメタの名前はフランス語っぽく後ろに修飾 してて tunnel の timeout time のパラメータです
で、これのデフォルトが 50秒 なんだそうです つまり、50秒間 tunnel を何も通らないと timeout します

# Melody の Ping Period

Websocket はデータが流れていない時、keep alive のために Server から一定時間感覚で ping がでて client が pong を返すことになっています
で、 Melody の Ping Period の設定がこちら (opens new window) で、

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

ええと、54秒 ですね
あちゃー、Haproxy の timeout tunnel が 50秒 だから、4秒遅くて timeout しちゃうじゃん

# 直し方

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

HAProxy の timeout tunnel の設定変更の仕方はあちこちにありますので、ここでは Melody の設定を変更してみます、そもそもタコ足になりがちな HAproxy の timeout いじるのはちょっと気が引けますし

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: 2024/3/27 12:04:10