small is beautiful

be the worst

IIS: Root application用のApplication Poolが存在する構成にするか否か

Root applicationとは

  • IIS Site作成時にdefaultで作成されるapplication。
  • 1SiteにつきRoot applicationが最低1つ以上存在する。
  • Root applicationを含む個々のapplicationはRoot virtual directoryに含まれる。
  • applicationhost.config 上のapplication PATHが "/" になる。

As in IIS 6.0, a site contains all the content, both static and dynamic, that is associated with that site. However, each site must contain at least one application, which is named the root application. And each application (including the root application) must contain at least one virtual directory, which is named the root virtual directory. These objects work together to form the site.

https://docs.microsoft.com/en-us/iis/get-started/planning-your-iis-architecture/understanding-sites-applications-and-virtual-directories-on-iis

When you see a single "/" in a path field, you know that this is a root object. Depending on whether it is in the application or virtual directory section, it is a root application or a root virtual directory.

Root Application用のApplication Poolが存在する構成

  • Root applicationは、Site名と同名のApplicationPoolに所属する。
  • applicationhost.config (C:\Windows\system32\inetsrv\config\applicationhost.config) においては、個々のSiteはRoot Applicationを持ち、site nameとapplicationPoolが同名であることが分かる。
<sites>
    <site name="foo.com" id="1">
        <application path="/" applicationPool="foo.com">
            <virtualDirectory path="/" physicalPath="C:\web\foo.com\wwwroot" />
        </application>
        <application path="/foo" applicationPool="foo.com_foo" enabledProtocols="http">
            <virtualDirectory path="/" physicalPath="C:\web\foo.com\foo" />
        </application>
    </site>
</sites>

Chefの場合は次のようになる。

application_pools: {
   "foo.com" => {
     applications: [{
       virtual_path: '/',
       physical_path: 'C:\\web\\foo.com\\wwwroot',
       vdirs: {
         path: 'foo.com',
         virtual_path: '/healthcheck',
         physical_path: 'C:\\web\\foo.com\\wwwroot\\healthcheck'
       }
     }],
   },
   "foo.com_foo" => {
     applications: [{
       virtual_path: '/foo',
       physical_path: 'C:\\web\\foo.com\\foo',
       vdirs: {
         path: '/healthcheck',
         virtual_path: '/healthcheck',
         physical_path: 'C:\\web\\foo.com\\wwwroot\\healthcheck'
       }
     }],
   }
 }

Root Application用のApplication Poolが存在しない構成

  • Root ApplicationがApplicationPoolとして独立せず、他Application PoolのApplicationに内包されている。
  • applicationhost.config 上の違いとしては、Root Applicationが所属するApplication PoolがSite名とは異なり他Application Poolの名称となっている点。
<site name="foo.com" id="1">
    <application path="/" applicationPool="foo.com">
        <virtualDirectory path="/" physicalPath="C:\web\foo.com\wwwroot" />
    </application>
    <application path="/foo" applicationPool="foo.com" enabledProtocols="http">
        <virtualDirectory path="/" physicalPath="C:\web\foo.com\foo" />
    </application>
</site>

Chefの場合は次のようになる。

application_pools: {
   "foo.com" => {
     applications: [{
       virtual_path: '/foo',
       physical_path: 'C:\\web\\foo.com\\foo',
       vdirs: {
         path: '/healthcheck',
         virtual_path: '/healthcheck',
         physical_path: 'C:\\web\\foo.com\\wwwroot\\healthcheck'
       }
     }],
   }
 }

Root Applicationをどうするべきか

https://docs.microsoft.com/en-us/iis/get-started/planning-your-iis-architecture/understanding-sites-applications-and-virtual-directories-on-iis

こちらを見るに特にRoot Applicationは削除したり変更するものではなく、Application Pool上に独立して存在する (Root Application用のApplication Poolが存在する) のが違和感無い。

Microsoft Developer Networkにあるapplicationhost.configのtemplate例 を見ると、Application Pool自体指定されていないものもあり、Root ApplicationのみApplication Poolに所属しない方法もあるかもしれない。

<site name="WebSite1" id="1" serverAutoStart="true">
    <application path="/">
        <virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" />
    </application>
</site>