港湾(こうわん、英: Port)とは、古くは泊(とまり)などから発展した港・湊(みなと)であり、島嶼・岬などの天然の地勢や防波堤などの人工構造物によって風浪を防いで、船舶が安全に停泊し人の乗降や荷役が行なえる海域と陸地を指す。
⇧ 「Port」は「湊(みなと)」で、「みなと」と言えば、Spitz の名曲「みなと」が有名ですね、どうもボクです。
そんな「Port」ですが、コンピューターの世界では、
- コンピュータ等において、外部との情報の受け渡しを行うための物理的なインタフェース。
- ポート (コンピュータネットワーク) - オペレーティングシステムがデータ通信を行うためのエンドポイント
なんかがありますが、今回は「ポート (コンピュータネットワーク) 」の話。
コンピュータネットワークにおいて、ポート(port)とは、オペレーティングシステムがデータ通信を行うためのエンドポイントである。「ポート」という言葉はハードウェア(入出力ポート)についても用いるが、ソフトウェアにおける「ポート」は、特定のプロセスやサービスの種類によって特定される論理的な構成概念である。
IPアドレスを建物の住所にたとえるなら、ポートは個別の部屋、ポート番号は部屋番号に相当する。
⇧ そんなわけで、まぁ、突然、部屋に入れなくなったら、どう思いますか?
悲しい気持ちになりませんか?
というわけで、ポートについて、レッツトライ~。
何が起きたか?
Windows Server 2016 に、某アプリケーションをインストールしていて、そのアプリケーションのWebサーバが、Apache Httpd で 80番ポートを利用していたわけです。
で、3か月ぐらい何事もなくアクセスできたわけですが、先日、突然動かないと言われ、調べてみたところ、アプリケーションのWindows サービスが起動できなくなっていて、サービスを起動しようとすると『サービスの製造元に問い合わせてください』みたいな警告が出るというね。
って言うか、この警告からポートがバッティングしてるなんて読み取れんから...
流石、Microsoftさん、相変わらずの不親切さ。
結論から先に言ってしまうと、「IIS(Internet Information Services)」の「World Wide Web Publishing Service(自分の環境では「World Wide Web 発行サービス」と表示されていた)」が、有効になってしまっていたことによる影響らしい。
おそらく、Microsoft Update の影響とは思いますが。
なので、自分の場合のケースだと、Windowsの「サービス」で「IIS(Internet Information Services)」の「World Wide Web Publishing Service(自分の環境では「World Wide Web 発行サービス」にあたる「サービス」を停止すれば、80番ポートを取り戻せました。
80番ポートを使ってるプロセスを探せ
ってなわけで、80番ポートを使ってるプロセスを確認するために、コマンドプロンプトを起動して、
netstat -nao
⇧ で、「PID」が特定できたんだけど、
調査したところ、
IISが実行されているとSystemとして表記されるらしい。。
【Apacheが起動しない】System(PID:4)にてポート番号80を使用/Windows10
⇧ ってことらしいんだけど、「タスクマネージャー」で該当する「PID」のプロセスは何なのか調べてみたら、「System(NT kernel & system)」ってものらしく、
タスクマネージャーで見ると、NT Kernel & systemとある。これはネットで検索すると、Windowsのシステムそのものだという。さて困った。正体がわからない。
⇧「Windowsのシステムそのもの」ってことで、「IIS(Internet Information Services)」なんて情報はどこにも出てこない。
で、「Process Explorer」ってものをダウンロードしてみました、って言うかMicrosoftで紹介されているツールらしい。
で、「Process Explorer」を使ってみたところ、プロセスとしては、
- Interrupts(Hardware Interrupts and DPCs)
- smss.exe(Sessions Manager Subsystem)
っていう2つが表示されたんで、調べてみたところ、
⇧「Interrupts」については、「遅延プロシージャ呼び出しと割り込みサービスルーチン」というものらしく、その中で、「smss.exe」ってものも動いてるらしく、
セッション・マネージャ・サブシステムは、Windows2000以降のバージョン下で、ユーザーのスタート、操作、終了セッションに関連した全ての動作を担っています。Windowsログオン(winlogon)及びクライアント/サーバー・ランタイム・サービス(csrss)プロセスを起動します。ターミナルサービス下での、クライアントセッションも処理します。オペレーティングシステムの核となる部分であり、削除すべきではありません。
⇧ こっちでも「IIS(Internet Information Services)」はヒットせず...
どうやって、「IIS(Internet Information Services)」に辿り着けたんだ?
IIS の「アプリケーションプール」というのは、IIS のウェブアプリケーションの「ワーカープロセス」の設定のことです。 そして「ワーカープロセス」というのは、そのウェブアプリケーションが実行されるプロセスのことです。
ちなみに、この svchost.exe というプロセスは Windows で各種サービスをホストするための汎用プロセスです。 従って svchost.exe という名前でホストされているサービスは多数ありますので、svchost.exe というプロセスが見えたからと言って、 IIS ではありませんので注意してください。
⇧ よく分からんのだけど、「w3wp.exe」ってやつが「IIS」に関連しているのだと。
「w3wp.exe」ってのは、「WAS(Windows Activation Services)」 の1構成要素らしい。
WAS は、複数のアーキテクチャ コンポーネントで構成されます。
-
リスナー アダプター : 特定のネットワーク プロトコルでメッセージを受信し、WAS と通信して、受信メッセージを適切なワーカー プロセスにルーティングする Windows サービス。
-
WAS : ワーカー プロセスの作成と有効期間を管理する Windows サービス。
-
汎用ワーカー プロセス実行可能ファイル (w3wp.exe)。
-
アプリケーション マネージャー : ワーカー プロセス内のアプリケーションをホストするアプリケーション ドメインの作成と有効期間を管理します。
-
プロトコル ハンドラー : ワーカー プロセスで実行され、ワーカー プロセスと個々のリスナー アダプター間の通信を管理するプロトコル固有のコンポーネント。 プロトコル ハンドラーには、プロセス プロトコル ハンドラーと AppDomain プロトコル ハンドラーの 2 種類があります。
⇧ ってことらしく、
ワーカー プロセス インスタンスをアクティブ化する場合、WAS は必要なプロセス プロトコル ハンドラーをワーカー プロセスに読み込み、アプリケーション マネージャーを使用して、アプリケーションをホストするアプリケーション ドメインを作成します。 アプリケーション ドメインは、アプリケーションのコードと、アプリケーションが使用するネットワーク プロトコルに必要な AppDomain プロトコル ハンドラーを読み込みます。
⇧ ってな感じで、ポートに関する情報が出てこず...
そもそも「WAS(Windows Activation Services)」って何?
Windows Process Activation Service (also known as WAS) is the process activation mechanism introduced within Internet Information Services v7.0.
⇧ ってな感じで、「IIS(Internet Information Services)」のバージョン7 で導入された「process activation mechanism」ってものらしい、サッパリ分からんですな。
「process activation mechanism」が何なのかは全く説明が無いというね、流石、Microsoftさん、安定の不親切さ。
Windows Activation Service allows the developers to choose the most appropriate protocol for their needs. For HTTP, data transfer relies on the ASP.NET HTTP. For protocols such as TCP and Named Pipes, Windows Activation Service leverages the extensibility points of ASP.NET for transferring data.
⇧ 『HTTPの場合、データ転送はASP.NET HTTPに依存します。 TCPや名前付きパイプなどのプロトコルの場合、Windows Activation ServiceはASP.NETの拡張ポイントを利用してデータを転送します。』ってことらしく、
These capabilities are implemented in the form of protocol handlers, which manage communication between the worker process and the Windows service. There are two types of protocol handlers loaded when the WAS activates a worker process instance: Process Protocol Handler (PPH) and App Domain Protocol Handler (ADPH).
⇧ 『これらの機能は、ワーカープロセスとWindowsサービス間の通信を管理するプロトコルハンドラーの形で実装されます。 WASがワーカープロセスインスタンスをアクティブ化するときに読み込まれるプロトコルハンドラーには、プロセスプロトコルハンドラー(PPH)とアプリドメインプロトコルハンドラー(ADPH)の2種類があります。』
だそうな。
- Process Protocol Handler (PPH)
- App Domain Protocol Handler (ADPH)
の2種類があるってはなしなんだけど、
⇧ Microsoftさんのドキュメントを見る限り、
のプロトコルハンドラーが存在するってことですかね?
Oreillyさんの「WCF」ってアーキテクチャの説明だと、
⇧ プロトコルハンドラーの数が違うんだけどね...
いや~、カオスですな、まぁ、Microsoftさんが本家ということもあり、Microsoftさんのドキュメントが間違ってるわけはないと思うので、Oreillyさんのほうが間違っているということになるかと。
で、「WCF」って何?
Windows Communication Foundation (WCF) は、サービス指向アプリケーションを構築するためのフレームワークです。 WCF を使用すると、サービスエンドポイント間で非同期メッセージとしてデータを送信できます。
サービス エンドポイントには、IIS でホストされている、継続的に使用可能なサービスの一部を使用したり、アプリケーションでホストされているサービスを使用できます。 エンドポイントには、サービス エンドポイントからデータを要求するサービスのクライアントを使用できます。
メッセージは XML として送信された 1 文字または 1 語の簡単なものでも、バイナリ データのストリームのような複雑なものでも構いません。
⇧ 「サービス指向アプリケーションを構築するフレームワーク」ということらしい。
⇧ 「サービス指向」は「SOAP」とか「REST」のことらしい。
マイクロサービス化されたアプリケーションのほとんどは、「サービス指向」と言えるってことですかね?
一旦、ここまでをまとめると、
- IIS の「アプリケーションプール」というのは、IIS のウェブアプリケーションの「ワーカープロセス」の設定のこと
- 「ワーカープロセス」というのは、そのウェブアプリケーションが実行されるプロセスのこと
- IIS(Internet Information Services)のワーカープロセスは「w3wp.exe」
- IIS(Internet Information Services) 本体のサービスは svchost.exe というプロセス名
- svchost.exe というプロセスは Windows で各種サービスをホストするための汎用プロセス(svchost.exe という名前でホストされているサービスは多数あるため、svchost.exe によるプロセス特定は無意味)
- 「w3wp.exe」ってのは、「WAS(Windows Activation Services)」 の1構成要素
- Windows Process Activation Service (also known as WAS) is the process activation mechanism introduced within Internet Information Services v7.0.
- 「WAS(Windows Activation Services)」は「WCF(Windows Communication Foundation)」の機能の一部
- 「WCF(Windows Communication Foundation)」は「サービス指向アプリケーションを構築するためのフレームワーク」
- 「WAS(Windows Activation Services)」はワーカープロセスである「w3wp.exe」をアクティブ化する(実行するってことかと)
- 「w3wp.exe」内の各々のプロトコルハンドラーがWindowsサービス間の通信を管理する
ってことですと。
ちなみに、「IIS(Internet Information Services)」のバージョン7 の構成は、
⇧ 上図のような感じらしいですと。
処理の流れは、
- HTTP要求がクライアントブラウザからサーバーへ到着します。HTTP.sys が要求を受け取ります。
- HTTP.sys が要求の送信先アプリケーションの構成情報が登録されているか確認をし、登録されていなかった場合は、HTTP.sys は W3SVC に問い合わせを行います。
- W3SVC は、WAS へ要求を渡します。
- WASは、IIS のサーバーレベルの構成情報である、applicationHost.config を構成ストアから取得します。
- WASは、要求されたアプリケーションプール内のワーカープロセスを確認します。ワーカープロセスが存在しない場合は、そのアプリケーションプール用のワーカープロセスを起動します。
- WASより、アプリケーションプールの情報や構成情報を W3SVC に渡します。
- W3SVC は、WASから受け取った構成情報に基づき、HTTP.sys へ設定および更新の通知をします。
- HTTP.sysは、その通知を基に、アプリケーション用のキューを作成してから、適切なワーカープロセスに要求を転送します。
- 要求を受け取ったワーカープロセスは、要求処理を開始します。
- 要求処理パイプラインのそれぞれの処理を行い、ワーカープロセスは、要求の処理結果を HTTP.sys へ返します。
- HTTP.sys がクライアントに応答を送信します。
⇧ ってな具合になるらしい。
さて、困った。
一向に「IIS(Internet Information Services)」の「World Wide Web Publishing Service(自分の環境では「World Wide Web 発行サービス」と表示されていた)」が、80番ポートのプロセスとして確認できなかった理由が分からない。
Microsoftさんのコミュニティで質問させていただきました。
■私の質問
つまり、「タスクマネージャー」や「ProcessExplorer」では80番を使用しているプロセスとして辿るのが困難であり、
「curl」コマンドなどを使って、アプリケーション(自分の場合ですとApache Httpd上で動いていたもの)のURLに
アクセスして、
・IIS
のどちらが機能しているか確認するぐらいしか
確認方法がないという感じでしょうか?
■有識者の方からの回答
そうなります。IISでの80番ポートの待ち受けは、カーネルモードのデバイスドライバでやっています。80番ポートにアクセスがあると、そのドライバからコールバックされる形で、World Wide Web Publishing Serviceなどのsvchost.exeで動作しているサービスやw3wp.exeなどのASP.NETなどの関連アプリケーションサーバが処理している形になります。ポートの待ち受けをしているプロセスと、実際にサービスを提供しているプロセスが異なるのです。
ワーカープロセスというのは、あらかじめ起動してアイドル状態にして管理されているプロセスのことです。プロセスを起動するためにメモリやプロセス管理情報を構築するのに時間がかかるために、あらかじめ起動しておいたプロセス/スレッドをアイドル状態にして複数プールしておいて、セッション要求があった時点で、アイドル状態のプロセスにジョブを割り当てています。
IISの動作状況や設定を確認するのであれば、PowershellのIISAdministrationのコマンド群を使うと便利です。
https://docs.microsoft.com/en-us/powershell/module/iisadministration/
⇧ むっちゃ丁寧に教えていただきました、本当にありがたいことです。
職場にもこんな先輩がいてくれたら、楽しく仕事ができるような気がしますね。
というわけで、ポート80番を使っているプロセスを確認する際に、「タスクマネージャー」や「Process Explorer」では、確認できないプロセスもあることを知っておくと、時間を無駄にせずに済むかもしれませんというお話。
今回はこのへんで。