次の方法で共有


Nano Server 上での IIS を使用した ASP.NET Core の実行

著者 David So

この記事では、Nano 上で IIS を使用して実行される ASP.Net Core アプリケーションを取得するために必要なステップについて概説します。

互換性

バージョン メモ
IIS 10.0 この記事で説明する機能は、IIS 10.0 で導入されました
IIS 8.5 以前 この記事で説明されている機能は、IIS 10.0 より前ではサポートされていませんでした

IIS のインストール

まず、Nano に IIS をインストールする必要があります。そのステップについては、Nano の公式ドキュメントで既に説明されています。 詳細については、次の記事をご覧ください。

リバース フォワーダーのインストール

現時点では、HttpPlatformHandler と Asp.Net Core Kestrel ホストの両方で、Nano マシンにリバース フォワーダー パッケージをインストールする必要があります。

リバース フォワーダーはオフライン (電源がオフになっているマシン) またはオンライン (稼働中のマシン) でインストールできます。

オフラインの場合、New-NanoServerImage コマンドレットを呼び出すときに –ReverseForwarders パラメーターを渡すことで、リバース フォワーダーをインストールできます。 例:

New-NanoServerImage -MediaPath f:\ -BasePath .\Base -TargetPath .\Nano1.vhd -GuestDrivers -Packages Microsoft-NanoServer-IIS-Package -ReverseForwarders

オンラインの場合、関連するパッケージで dism を呼び出すことで、リバース フォワーダーをインストールできます。

  • dism /online /add-package /packagepath:c:\packages\Microsoft-OneCore-ReverseForwarders-Package.cab
  • dism /online /add-package /packagepath:c:\packages\en-us\Microsoft-OneCore-ReverseForwarders-Package.cab
  • <reboot>

1 番目のコマンドは、リバース フォワーダーの機能パッケージをインストールします。

2 番目のコマンドは、パッケージに関連付けられている言語パックをインストールします。

この場合、C:\packages は自身が作成したローカル ディレクトリで、Nano Server メディアのインストール場所から Packages フォルダーをコピーしました。

リバース フォワーダー パッケージを (オフラインまたはオンラインのどちらでも) インストールした後は、dism /online /get-packages を実行して、IIS とリバース フォワーダーが正しくインストールされていることを確認します。

Microsoft-NanoServer-IIS-Package と Microsoft-OneCore-ReverseForwarders-Package の機能パックと言語パックが表示されます。

HttpPlatformHandler のインストール

現時点では、Nano への HttpPlatformHandler のインストールは手動で行います。

面倒な作業であることは理解しています... そのため、改善に取り組んでいます。

Nano は 64 ビットのみ (WOW なし) であるため、最新の x64 バージョンの HttpPlatformHandler (https://www.iis.net/downloads/microsoft/httpplatformhandler) を、通常の (Nano でない) マシンにインストールする必要があります。

通常の (Nano でない) マシンに x64 ビット バージョンの HttpPlatformHandler をインストールしたら、2 つのファイルを Nano マシンにコピーする必要があります。

  • %windir%\System32\inetsrv\httpPlatformHandler.dll
  • %windir%\System32\inetsrv\config\schema\httpplatform_schema.xml

Nano マシンでは、これらの 2 つのファイルをそれぞれの場所 (dll -> inetsrv、スキーマ ファイル -> inetsrv\config\schema) にコピーする必要があります

  • copy .\httpPlatformHandler.dll c:\Windows\System32\inetsrv
  • copy .\httpplatform_schema.xml c:\Windows\System32\inetsrv\config\schema

HttpPlatformHandler の有効化 (PowerShell)

Nano マシンへの PowerShell のリモート セッションで、以下のステップを実行できます。

以下のステップはクリーン システムで動作しますが、べき等であることを意味するものではありません。 これを複数回実行すると、複数のエントリが追加され、問題が発生します。 最終的に悪い状態になってしまった場合、applicationHost.config ファイルのバックアップは %systemdrive%\inetpub\history で見つかります。

Import-Module IISAdministration
$sm = Get-IISServerManager

# Add AppSettings section (for Asp.Net Core)
$sm.GetApplicationHostConfiguration().RootSectionGroup.Sections.Add("appSettings")

# Unlock handlers section
$appHostconfig = $sm.GetApplicationHostConfiguration()
$section = $appHostconfig.GetSection("system.webServer/handlers")
$section.OverrideMode="Allow"

# Add httpPlatform section to system.webServer
$sectionHttpPlatform = $appHostConfig.RootSectionGroup.SectionGroups["system.webServer"].Sections.Add("httpPlatform")
$sectionHttpPlatform.OverrideModeDefault = "Allow"

# Add to globalModules
$globalModules = Get-IISConfigSection "system.webServer/globalModules" | Get-IISConfigCollection
New-IISConfigCollectionElement $globalModules -ConfigAttribute @{"name"="httpPlatformHandler";"image"="%SystemRoot%\system32\inetsrv\httpPlatformHandler.dll"}

# Add to modules
$modules = Get-IISConfigSection "system.webServer/modules" | Get-IISConfigCollection
New-IISConfigCollectionElement $modules -ConfigAttribute @{"name"="httpPlatformHandler"}
$sm.CommitChanges()

HttpPlatformHandler の有効化 (applicationHost.config の手動編集)

上記の PowerShell のステップを既に実行している場合は、このセクションをスキップできます。

PowerShell のステップに従うことをお勧めしますが、HttpPlatformHandler を有効にするために IIS の applicationHost.config ファイルを絶対に編集する必要がある場合は、次のステップを実行します。

c:\windows\system32\inetsrv\applicationHost.config を開きます。

(PowerShell ISE v5 を使用している場合は、psedit c:\windows\system32\inetsrv\applicationHost.config を使用してこれを行うことができます)

<configSections> の下に、次のように追加します

<configSections>
<section name="appSettings" />

system.webServer セクションで、Deny から Allow にしてハンドラーのロックを解除します

<section name="handlers" overrideModeDefault="Allow" />

system.webServer セクションで、新しい httpPlatform セクションを追加します

<section name="httpPlatform" overrideModeDefault="Allow" />
</sectionGroup>

globalModules に次のコードを追加します

<add name="httpPlatformHandler" image="%SystemRoot%\system32\inetsrv\httpPlatformHandler.dll" />
</globalModules>

Modules に次のコードを追加します

<add name="httpPlatformHandler" />
</modules>

Asp.Net Core アプリケーションのインストール

まず、coreclr and x64 を対象に Asp.Net Core アプリケーションがビルドされていることを確認します。

他の組み合わせは Nano では機能しませんので、これは非常に重要です。

coreclr/x64 用にビルドした後、アプリケーション全体を Nano マシンにコピーする必要があります。この例では、c:\HelloAspNetCore を使用しています。

次に、ポート 8000 を使用する c:\HelloAspNetCore\wwwroot を指す新しいサイトを設定します (わかりやすくするために、既定のアプリ プールを使用します)

既定のポート 80 で Asp.Net Core サイトを実行しても問題はありませんが、テスト環境では、問題が発生したときにトラブルシューティングを簡単に行えるように (たとえば、既定の IIS サイトがまだ正常に動作することを確認できるように)、Asp.Net Core アプリを既定の Web サイトから分離することをお勧めします。

IIS PowerShell を使用して、次のようにします。

Import-module IISAdministration
New-IISSite -Name "AspNetCoreSite" -PhysicalPath c:\HelloAspNetcore\wwwroot -BindingInformation "*:8000:"

c:\windows\system32\inetsrv\applicationHost.config を次のように編集して、サイトを手動で作成します (上記の PowerShell を使用して既に作成している場合は省略します)。

<sites>
<site name="Default Web Site" id="1">
    <application path="/">
        <virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:80:" />
    </bindings>
</site>
<site name="AspNetCoreSite" id="2">
    <application path="/">
        <virtualDirectory path="/" physicalPath="C:\HelloAspNetCore\wwwroot" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:8000:" />
    </bindings>
</site>
… rest of xml…
</sites>

次のステップでは、ファイアウォールでポート 8000 を開きます。

New-NetFirewallRule -Name "AspNetCore" -DisplayName "HTTP on TCP/8000" -Protocol tcp -LocalPort 8000 -Action Allow -Enabled True

トラブルシューティング

まず、IIS 自体が正しくインストールされていることを確認します。 http://<ipaddress> により、既定のページ (青い IIS ページ) が表示されます。表示されない場合は、非常に基本的な部分が正しく設定されていません。

次に、アプリケーションがスタンドアロンで実行できることを確認します。 例: c:\HelloAspNetCore\approot\web.cmd

3 番目に、HttpPlatformHandler によって作成されたログが表示されていることを確認します (例: c:\HelloAspNetCore\logs)。