IIS の アプリケーションプール・サイト・アプリケーション・仮想ディレクトリについて

#概要
IIS の以下について一体何なのかを調べた備忘録。

- アプリケーションプール
- サイト
- アプリケーション
- 仮想ディレクトリ

について公式ドキュメント読んでも謎だったのでまとめた。

#参考
https://qiita.com/matarillo/items/2d713603f23b0ac165f3
https://qiita.com/matarillo/items/c7ec64ae8e3b9a65f5ea
https://blogs.technet.microsoft.com/jpiis/2014/12/15/iis-7-5-windows-server-2008-r2/

#全体像
![iis_archi_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/27f7616e-c3b8-89c7-f17a-53fd1aa553e8.png)


##サイト
「IPアドレスとポートとホスト名（FQDN）」と 1対1 に紐づけられるディレクトリ。

##アプリケーションプール
ちょっと長い説明ですが、「HTTPリクエスト(http://example.co.jp など)を受けた際、その url(ここでは http://example.co.jp) に対応するサイトを動作させるためのプロセス」の設定。「どういうプロセスで動かすか？」を表すテンプレートといってもよい。

##アプリケーション
サイトをプログラムとして動作させる単位。↑のアプリケーションプールの説明内に 「サイトを動作させる」という記述があるが、サイトというのはあくまで「『IPアドレスとポートとホスト名（FQDN）』と 1対1 に紐づけられるディレクトリ」、つまり単なるディレクトリなので IIS からみて動作させる単位が必要であり、その動作させる単位がアプリケーションと呼ばれる。

サイト作成時には、サイトの物理パスと同じパスに「ルートアプリケーション」というものが自動で生成される。なので、アプリケーションを一つも自分で作らなくても、サイトには必ず1つのルートアプリケーションが紐づく。
また、1つのサイト内には複数のアプリケーションを作ることができる。

###サイトとアプリケーションに紐づくアプリケーションプール
後で記述するが、サイト作成時にはアプリケーションプールを指定する。サイトと同時に作られるルートアプリケーションは、このサイトに紐づくアプリケーションプールから生成されるプロセスで処理される。
対して、自分で手動でサイト内に作るアプリケーションはサイトに紐づく以外のアプリケーションプールを割り当てることもできる。

##仮想ディレクトリ
名前の通り、「サイト内にパスを自由に変えて作れるディレクトリ」。前述のアプリケーションはアプリケーションプールの設定ができるのだが、仮想ディレクトリは設定できない。
単にディレクトリを伸ばしたもの(Linux でいうマウントでディレクトリが追加された、みたいなイメージ)という理解でよい。

各アプリケーション(ルートアプリケーションも)には一つの仮想ディレクトリが紐づいている。言い換えると、物理パスを紐づける役割が仮想ディレクトリといってもいい(アプリケーションは自身の物理パスの紐づけに仮想ディレクトリを使っている、ということ)。

#実際に作ってみる
vbscript で試してみます。


##ディレクトリ構成

C:/
　├ IISSample
　│　├ application1
　│　│　　└ test.asp
　│　│
　│　├ application2
　│　│　　└ test.asp
　│　│
　│　└ VirtualDirectory
　│　　　　└ test.asp
　└ test.asp

###各ファイル内容
```vb:test.asp
<html>
<body>
<%
Response.Write "IIS Sample"
%>
</body>
</html>
```

```vb:applciaiton1/test.asp
<html>
<body>
<%
Response.Write "application 1"
%>
</body>
</html>
```

```vb:applciaiton2/test.asp
<html>
<body>
<%
Response.Write "application 2"
%>
</body>
</html>
```

```vb:VirtualDirectory/test.asp
<html>
<body>
<%
Response.Write "virtual directory"
%>
</body>
</html>
```


###前提
IIS のサイトは、ディレクトリ構成そのままの url で基本アクセスできる。
つまり、サイトのホスト名(urlのドメイン)が site1-local で、サイト内部の applciation1/test.asp にアクセスしたい場合は、
「http://site1-local/application1/test.asp」 でアクセスできる。

##アプリケーションプール作成
<img width="959" alt="iis_archi_apppool1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/bb386bb5-b6e8-5450-cb65-574c821e52f4.png">
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/e464bac9-2524-059b-9791-3250883afe72.png)
<img width="965" alt="iis_archi_apppool2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/c750b4ae-f3b8-c379-57c2-3ea7c4bb93e6.png">

##サイト作成
↑で作ったアプリケーションプールを紐づけます。サイト名は IIS 上で識別するための名前です。
外部に公開する際に使うのはホスト名(今回は site1-local)。

<img width="956" alt="iis_archi_site1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/00e9f673-c92c-7b06-a2d2-23719800c608.png">
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/5f8573fe-cd5b-3a73-96b5-33332f29fb8e.png)

サイトの物理パスと同じ物理パスを持つルートアプリケーションが登録されているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/370eb56a-8251-ab43-c43e-218355f6f1c7.png)

###ブラウザでアクセスしてみる
site1-local という url をサイト作成時に設定しましたが、site1-local という url が localhost(=127.0.0.1)を示す設定が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/bf04b72b-5b91-0329-503a-16443ab1de72.png)

```text:hostsに以下を追記
127.0.0.1 site1-local
```

ちゃんと動いているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/e776fa53-6003-b241-bba9-5f9ae734bd7e.png)

###サイトを動かすプロセス
アプリケーションはサイトを動作させるプロセスを生み出すテンプレート、といったのを覚えてますでしょうか。
プロセスを確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/7919ceec-21ec-4ec8-6a68-64dcb95ae009.png)

w3wp.exe というのがサイトを動作させているプロセス(=ワーカープロセス)です。
プロセスの実行ユーザー名がアプリケーションプール名 ApplicationPool-1 になっているのも注目です。
(実行ユーザーと読み取れるディレクトリの制限で重要になってきます)。
<img width="576" alt="iis_archi_process1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/0824bede-b021-dced-9524-f0bcb6ac3fb0.png">

##サイト内にアプリケーションを作成
application2 ディレクトリを、今作った application1 ディレクトリをルートとするサイトから読み取れるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/8d1bf1bf-38ec-82e8-b529-28651cdd2ea8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/b866d19a-cec0-4996-1e72-0bf969c223ef.png)
<img width="959" alt="iis_archi_application1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/4ed885dc-caf3-e351-4cd6-2826232ba3cb.png">


ブラウザでアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/f25ddc02-d5a8-ab62-6a59-995b8750b6c9.png)

##サイト内に仮想ディレクトリを追加
VirtualDirectory ディレクトリを、今作った application1 ディレクトリをルートとするサイトから読み取れるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/c420fbaa-8dad-9304-0844-370bd88ba6a4.png)

アプリケーションと比べて、アプリケーションプールの設定がないことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/32eca137-7e10-d706-af4a-2eb1c915987d.png)
<img width="957" alt="iis_archi_virtual1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/94aae158-bcd5-4c67-3b1a-0e817152c73a.png">

ブラウザでアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/c2d398f0-1868-fbf1-ed7d-14acc77419a1.png)

#応用編
##複数のアプリケーションプールを一つのサイト内で使ってみる
アプリケーションプールを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/9fd1aac3-0ccc-2b9d-d9e0-9935a6c1502b.png)

サイト内のアプリケーションが紐づくアプリケーションプールを新しいアプリケーションプール(ApplicationPool-2)に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/5ad4cbbb-32e0-15fa-700a-57387a3efcdf.png)

動作は正しいです(表示するまで少し時間がかかるかもしれません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/b781f55c-0b0f-aa36-68e9-b00d10a339be.png)

###複数のアプリケーションプール=複数のプロセス
ApplicationPool-2 という実行ユーザーのプロセスが新たに確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/69ebbb82-f886-f7c0-f0f1-0b827adc428d.png)
<img width="576" alt="iis_archi_process2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/88f3e735-281c-d22a-d693-42ada0a15d53.png">

##上位のディレクトリのアプリケーションに紐づくアプリケーションプールを停止した場合
サイトのルートアプリケーションが紐づくアプリケーションプール ApplicationPool-1 を停止してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/d5a17c2e-2592-64b8-6ef0-6d5fbdfb831b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/6dc58df6-233b-8929-6321-dd59c031778d.png)

内部に手動で作ったアプリケーションへのアクセスをブラウザで確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/583cb7ca-2a2e-1f0d-cf43-cc184f0a133b.png)

正しく動いています。
ではルートアプリケーション内はどうでしょうか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/54e7197b-a249-d874-e4a6-df6564a5ebf1.png)

こちらは 503 で動いていないことがわかります。
つまりディレクトリやアプリケーションの階層ではなく、プロセス単位でサイトへのアクセスが生きているか死んでいるかが決まることがわかります。

プロセスも 実行ユーザー ApplicationPool-1 は存在していないことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/31566c9d-017b-b8f0-d3dc-fb1b071c213c.png)
<img width="576" alt="iis_archi_process3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/9407197f-b971-20ae-182a-ba730607133b.png">

###仮想ディレクトリはどうなった？
仮想ディレクトリもアプリケーションプールを設定できない(=今回はルートアプリケーションと同じ)ので、同じく 503 となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/7f048292-0830-8cfc-ba01-5c0ac48f8d5c.png)

####仮想ディレクトリを手動で追加したアプリケーションの下に追加する
<img width="959" alt="iis_archi_virtual2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/094e62c6-2ce3-768e-af5f-8535b5b98a33.png">
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/10294658-4588-fb18-d8c7-36ac7718afd9.png)
<img width="959" alt="iis_archi_virtual3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/6e7a20cc-899f-033c-bf7a-3e47163bdc95.png">

ブラウザでアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/490c56ac-74fc-5448-d8ed-8aa0959ecaa0.png)

正しく動いています。
仮想ディレクトリはアプリケーションプールを設定できないので、仮想ディレクトリがサイトとして動作するときのアプリケーションプールは、仮想ディレクトリをどのアプリケーション内に作成するか(そのアプリケーションが紐づくアプリケーションプール)で決まることがわかります。