はじめに
BizRobo! はサーバーで動く RPA 製品ですが、ちょっとした検証や開発作業のために組み込みのサーバー機能が付属しています。
ロボットを運用する環境として使うことはないですが、ちょっとした機能の確認をしたい場合には便利なので Winodws PC 上で使っています。
今回は空き時間でちょっと確認したいことがあり組み込みサーバーを立ち上げたもののポート重複のエラーに見舞われ、挙句持ち時間の全てを原因調査で溶かしてしまいました。
結局原因の解明には至らず、推測の域を出られていませんが。。。
同じ現象に遭遇した人が無駄な時間を使わないために、備忘録を残しておきます。
本記事は、BizRobo! v11.4.0.2 時点の情報を基に記述しています。
久しぶりにサーバーを起動したら「ポートの重複エラー」
Windows のスタートメニューから久しぶりに「Start Management Console」を選択し、MC
を起動したところ、以下のエラーに遭遇しました。
Failed to start Management Console.
Failed to start embedded Tomcat, check if port 50080 is already in use.
異なるバージョンの MC
を立ち上げたまま重複起動してしまった場合に発生したことはありますが、50080 ポートを一般的に利用するソフトウェって聞いたことが無いですね。
ポートの重複確認
まずはエラーとなった MC
のコンソールを閉じます。忘れず閉じましょう!1 その後、コマンドプロンプトを起動し、MC
以外で 50080ポートを使っているプロセスが無いか確認します。
> netstat -ano | findstr :50080
50080 を使っているプロセスはないようですね。。にもかかわらず「重複エラー」が出るのは謎です。
OS 再起動によるエフェメラルポートのリセット?
昨日までは普通に起動していたのに、今日になったらポートの重複エラーで MC
が立ち上がらないということは今までにもありました。理由は明らかではありませんが OS を再起動することで大抵は解消されていました。
あくまで推測ですが、使用しているポート番号が 50080 ということもあり、PC上で TCP/IP の通信を行う何らかのソフトウェアがレスポンス受信用のポートとして動的に予約/ブロックしたり、ウィルス監視ソフトやその他システムソフトウェアが利用しているんじゃないか2?とも思っています。
そうである場合、OSを再起動することで動的割り当てポートがリセットされたり再度割り当て処理が実行されて、結果的に 50080 が解放されるんじゃないかな?という仮説に拠ります。
ただ、今日に限っては何度PCを再起動しても解消されませんでした。。。
エフェメラルポートとは
IT用語辞典 からの一部抜粋
多くのプロトコルや通信システムでは、サーバ側のポートはあらかじめ規格などで決められた特定の番号を用いるよう定められているが、クライアント側のポート番号は特に定めがない場合が多い。
このとき、クライアント側は特に用途の決まっていないエフェメラルポートの中から適当に一つを選んでその場での通信のために用いる。通信が終わるとポートの占有は解放され、別のソフトウェアや用途で使用できるようになる。
具体的にどのような番号の範囲をエフェメラルポートとして用いるかはシステムによって異なる。ポート番号の用途の登録を受け付けているIANA(Internet Assigned Number Authority)では49152~65535番を “The Dynamic and/or Private Ports” の名称で私的あるいは動的に用いる範囲と定義しており、FreeBSDや最近のWindowsなどはこの範囲を利用する。
ウェル ノウン ポートを使ってみる。
エフェメラルポートの回避策として、ウェル ノウン ポート 等、エフェメラルポート以外の値を MC
に設定して起動してみます。
とりあえずは HTTP で使用される 80 ポートを RoboServer Settings ツールで指定します。
再度 MC
を立ち上げると、、
はい。 問題なく起動しました。
エフェメラルポート以外を指定すれば動きそうです。3
エフェメラルポートの範囲で有効な値を探してみる。
一方で OSの再起動やエフェメラルポート以外の利用を避けたいのであれば、エフェメラルポートの中で有効な値を探索するか、ポートの除外範囲を指定して安全地帯を設けるのがいいかもしれません。
MC
以外では RoboServer
の 50000 番や、DAS
の 49998・49999 などは固定化して運用することが多いと思うので、除外範囲として設定しておくのがいいでしょう。
以下、コマンドプロンプトからの除外範囲設定方法です。4
netsh int ipv4 add excludedportrange protocol=tcp ^
startport=50080 numberofports=1 store=persistent
一方、今回はエラーとなった 50080 を含め、どのぐらいの範囲が使用不可になっているのか調べてみました。
閾値を求めるために何度も RoboServer Settings でポートの値を変えて起動と停止を繰り返した結果、50060 ~ 50400 の範囲が「重複ポートエラー」であることが分かりました。一部 netstat -ano | findstr :50080
で具体的な使用中プロセスが見つかった場合もありすべてが同じ原因ではないと思いますが、かなり広い範囲のポートがブロックされて使用できない状態でした。
いつもであれば 50080 ポートが重複エラーで使用できない場合も、ポート番号を1つずらして 50081 等を指定すれば問題なく起動できたりするのですが、今回は何なんでしょうか? それを突き詰める意義も見いだせなかったため、調査もここまでとしました。
まとめ
特に落ちもないのですが、なんか面倒くさいので除外ポートを設定しておこうかな。。と思いました。
来年もよろしくお願いします。