[Windows] Httpevent 15005

Windowsだとこんなことがあるのだということでメモ。

Tomcatを使用するアプリケーションとUltiWebを使用するアプリケーションをインストールするとウェブサーバへのアクセスがうまくできないというトラブルが発生。

イベントログには 15005 がエラーとして記録されている。

Httpevent 15005
http://technet.microsoft.com/en-us/library/cc727839(v=WS.10).aspx

symbolic name: EVENT_HTTP_CREATE_ENDPOINT_FAILED
message: Unable to bind to the underlying transport for %2. The IP Listen-Only list may contain a reference to an interface which does not exist on this machine. The data field contains the error number.

このメッセージが日本語に翻訳されるとよくわからなくなる。イベントログのビューワのインタフェースとしてlocale切りかえがあったら便利だろう。

上記のページには以下のような説明がある。

To receive HTTP requests, a server application must have its URL registered with the HTTP Service. If the server application is running without administrative credentials, the server application must reserve a URL namespace before it can register. Reserving a URL namespace creates an access control list (ACL) for that namespace. Additionally, a server application (hosted by the HTTP Service) might conflict with another application (not hosted by the HTTP Service) if both use the same IP addresses and port.

Windows上のアプリケーションがHTTP リクエストを受信するにはHTTP Serviceに登録しなければならない。サーバアプリケーションが管理者権限なしに実行されていると、登録するまえにURL namespeceを予約しなければならない。namespaceを予約するとそのnamespaceについてaccess control list(ACL)が作られる。加えて、仮に同じIPアドレスとポートを使えば、HTTPサービスにホストされているサーバアプリケーションとHTTPサービスにホストされていないサーバアプリケーションが競合するかもしれない。

この最後の行にあるように別のアプリケーションがHTTP Serviceにホストされずに同じアドレスとポートを使っているとHTTP Serviceにホストされているアプリケーションと競合する可能性がある。

HTTP サービスに登録されているかを以下のコマンドで確認すると、Tomcatは登録されていない。

netsh http show urlacl

一方、socketの使用プロセスを見るコマンドではTomcatが表示される。

netstat -ba

アプリケーションが登録したACLの情報は以下のレジストリに格納されている。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters\UrlAclInfo

双方のソースコードを確認したわけではないので以下は推測。
Tomcatが直接socketをbindするのに対して、UtilDev WebはHTTPサービス経由でのlistenを行うために netshでコマンドを実行して予約を行っている。
ところが、何らかの理由で常にTomcatのbindが先に行われるため、あとから来たHTTPサービスを介した同じポートのbindがエラーとなり全体の動作が止まる。
したがって、TomcatのポートとUtilDevのポートが重複しないように設定できればいいのではないか。

これはWindowsに限らず、socketという仕組みを使ってTCPで通信する場合には、サーバが同じアドレスとポートをbindすることはできないのではないだろうか。
たとえば、apacheやTomcatが全く同じ設定で2個別々に立ち上がって正常動作することはないだろう。それと同じ現象だと考えると、Windowsが特におかしい動作をしているわけではない。

ただし、Windowsの場合、HTTPサービス経由と直接socketを使う方法の2つの経路があるため、エラーに気づきにくい。

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。