著者 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
)。