Flaskではデフォルトでは5000番ポートで開発サーバが起動する。
自分はとあるアプリの開発で普段、Flaskで開発したとあるアプリをMac上で起動しているんだけどこれがある日うまく動かなくなった。アプリケーション的になにかをいじったわけではなく、ぱっと思いつく心あたりはない。
ターミナルからMacで使用されているポートを確認したら確かに5000番が何かに使われている(IPとかユーザ名だけマスクした)。
% lsof -i:5000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ControlCe 490 xxxxxxx 22u IPv4 0xf8bcd361exxxxxxxx 0t0 TCP *:commplex-main (LISTEN) ControlCe 490 xxxxxxx 23u IPv6 0xf8bcd36xxxxxxxxx 0t0 TCP *:commplex-main (LISTEN)
とはいえ何もいじってないのに急に動かなくなるなんてことはハードウェア的なものでもなければそうそうおきない。大抵こういうときは何もしていないつもりで何かしたことが原因だって僕は知ってる。
じゃあ、最近何をしたか?
そう、Mac OSのアップデートだ。つい2, 3日前に最新のMontereyにアップデートしたばかりだった。
というわけでその辺を調べてみたところドンピシャだった。
Montereyの新機能の一つにAirPlayのレシーバーになれるというものがある。これが原因だった。AirPlayのレシーバーになれるという話自体はこちらの記事などを参照してほしい。
これが5000番ポートを使ってListenするようになったのだ。
そんなわけなので結論から言うとFlaskで起動するポートを5000番以外にするか、この機能を停止すればいい。
この機能を停止するのは以下のように、Sharing設定からAirPlay Receiverのチェックを外してOFFにするだけ。
僕はFlaskが利用するポートを変えるのは都合により影響大きくちょっと手間なのでAirPlayレシーバーをオフにする方を選択した。
いやー、良かった。ちょっと切羽詰まってたので焦った。
余談だが、僕の場合はDocker ContainerとRemote Containersで開発している。当然ながらこのFlaskのアプリもコンテナ上で動かしている。なので実際にはこのFlaskのアプリも起動自体はできる。コンテナの中なので。
で、普段はそのコンテナ内で起動したプロセスが利用するポートにMac側からアクセスできるようにポートのフォワード設定をして動かしている。この設定がなぜか5000番ポートのフォワード設定が有効にならなくなったことに気づいたので今回の問題に気づけた。そこに気づけなかったらきっと今も原因不明で途方にくれてたと思う。