Tomcat9がWindows10で起動できないのはポート8005が原因だった

Tomcat9をWindows10にインストールしてみたのですが起動しないという現象が起きました。原因は、Windows10が既に使用しているポート8005をTomcat9で使用しようとしていたためでした。この記事では、原因の特定方法を順を追ってご紹介します。

Tomcat9がデフォルト設定で起動しない

Tomcat9をインストールし、GUIから起動しようとするも起動状態にならない。デフォルトから設定変更なくインストールしているはずなのですが。。

調査開始

なんでかなとログを確認してみます。

ログの場所はデフォルトではC:\Program Files\Apache Software Foundation\Tomcat 9.0\logs\catalina.yyyy-mm-dd.logです。

03-Aug-2018 21:30:24.962 情報 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
03-Aug-2018 21:30:24.983 情報 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
03-Aug-2018 21:30:24.990 情報 [main] org.apache.catalina.startup.Catalina.start Server startup in 1209 ms
03-Aug-2018 21:30:24.998 重大 [main] org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:8005]: 
 java.net.BindException: Address already in use: NET_Bind
  at java.base/java.net.DualStackPlainSocketImpl.bind0(Native Method)
  at java.base/java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
  at java.base/java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:437)
  at java.base/java.net.PlainSocketImpl.bind(PlainSocketImpl.java:174)
  at java.base/java.net.ServerSocket.bind(ServerSocket.java:381)
  at java.base/java.net.ServerSocket.<init>(ServerSocket.java:243)
  at org.apache.catalina.core.StandardServer.await(StandardServer.java:422)
  at org.apache.catalina.startup.Catalina.await(Catalina.java:770)
  at org.apache.catalina.startup.Catalina.start(Catalina.java:716)
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.base/java.lang.reflect.Method.invoke(Method.java:564)
  at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:353)
  at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:493)

03-Aug-2018 21:30:25.000 情報 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
03-Aug-2018 21:30:25.116 情報 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
03-Aug-2018 21:30:25.382 情報 [main] org.apache.catalina.core.StandardService.stopInternal サービス [Catalina] を停止します

4行目、5行目が怪しいですね。8005ポートはalready in useとあります。8005ポートを使うような設定をした記憶は無いので、何が使用しているのか調べてみます。

コマンドプロンプトで8005ポートを使用しているサービスのPIDを調べます。

> netstat -nao

アクティブな接続

  プロトコル  ローカル アドレス      外部アドレス           状態            PID
  TCP         0.0.0.0:8005           0.0.0.0:0              LISTENING       4
  TCP         [::]:8005              [::]:0                 LISTENING       4

PID4のサービスが使用していることが分かりました。それではPID4は何のサービスなのか調べます。

タスクマネージャーを開き、詳細タブを見てみます。

PID4のサービスがありましたね。Systemが使っているようです。説明を見るとNT Kernel & Systemとあるので、かなり深い階層のサービスですね。

原因特定

上記の調査によって、かなり深い階層のサービスと思われるNT Kernel & Systemがポート8005を使っていることが確認できました。Tomcat9が起動しなかったのは、NT Kernel & Systemが既にポート8005を使用していたためですね。

Tomcatの設定を確認してみると、シャットダウン時の通信にポート8005を使うよう設定してありました。この設定はTomcat共通のデフォルト設定です。ですので、以前違うサーバーにTomcatをインストールしたときにもポート8005を使用しているはずです。

にも関わらず、何事もなく起動が出来ていたのはサーバー側でポート8005を使用していなかったためでしょう。このことより、今回どちらかというと問題だったのはWindows10端末がポート8005を使用していることかと思います。

Let's share SNS