ASP.NET 2.0/3.5 共有ホスティング構成

投稿者: Walter Oliver

はじめに

IIS には、動的なコンテンツ (特に ASP.NET) を強化する機能が備わっています。 IIS 7.0 以降では、ASP.NET ランタイム拡張モデルがコア サーバーと統合されています。 これにより、開発者は下位レベルの C++ API を使用する代わりに、ASP.NET 2.0 以降の豊富な機能と .NET Framework を使用して、IIS を完全に拡張できます。 既存の ASP.NET アプリケーションは、フォーム認証、ロール、出力キャッシュなどの既存の機能を、.aspx ページだけでなく、あらゆる種類のコンテンツに使用できるため、より緊密な統合からメリットを享受できます。

ASP.NET と IIS の統合の主な機能とメリットについては、コア Web サーバーの概要に関するページを参照してください。 .NET Framework 3.5 の詳細とインストール方法については、https://www.microsoft.com/net/ または ASP.NET コミュニティ サイトを参照してください。

次の設定は、ホスティング ガイダンスの「共有ホスティング アーキテクチャの計画」の記事で説明されている共有ホスティング アーキテクチャの一部として、Web サーバーで使用されました。 これらの設定が推奨される理由と構成方法の詳細については、『ASP.NET 4 ホスティング展開ガイド』をダウンロードしてください。

信頼レベルの構成

信頼レベルを使用すると、ASP.NET のセキュリティ規則を定義できます。 ディスクからの読み取りやレジストリへのアクセスなど、アプリケーションで実行できる操作の種類を定義します。 推奨される信頼レベルは中程度で、一般的な操作の多くを許可しますが、危険なアプリケーションの多くを制限します。 中程度の信頼よりも多くの操作を許可する必要がある場合は、カスタム信頼レベルを作成してください。

カスタム信頼レベルを構成し、追加のアクセス許可を構成する方法

  1. %windir%\Microsoft.NET\Framework \{version}\ CONFIG ディレクトリに移動します。

  2. 中程度の信頼のポリシー ファイル web_mediumtrust.config をコピーして、同じディレクトリ %windir%\Microsoft.NET\Framework\{version}\ CONFIG\ に新しいポリシー ファイルを作成します。

  3. カスタム信頼レベルであることがわかるように、ファイルの名前を web_CustomTrust.config などに変更します。

  4. 新しいファイル web_CustomTrust.config を開き、WebPermission セクションを見つけます。

    ...

    <IPermission class="WebPermission"
    
    version="1"
                   <ConnectAccess>
                       <URI uri="$OriginHost$" />
                   </ConnectAccess>
         </IPermission>
    

    ...

  5. WebPermission に編集を加え、ConnectAccess 要素を削除し、Unrestrictedtrue に設定します。

    ...

    <IPermission class="WebPermission"
    
    version="1" 
                      Unrestricted="true"/>
    

    ...

  6. 共有ホスティング環境で必要であることが知られていない限り、PrintingPermissionEnvironmentPermission をコメント アウトします。

  7. 以下に示すように、新しい <trustLevel> 要素を Web.config ファイルの <securityPolicy> セクションに追加します。

    <location allowOverride="true">
    
        <system.web>
          <securityPolicy>
           <trustLevel name="Full" policyFile="internal" />
           <trustLevel name="High" policyFile="web_hightrust.config" />
           <trustLevel name="Medium" policyFile="web_mediumtrust.config" />
           <trustLevel name="Low" policyFile="web_lowtrust.config" />
           <trustLevel name="Minimal" 
                       policyFile="web_minimaltrust.config" />
           <trustLevel name="Custom" policyFile="web_CustomTrust.config" />
          </securityPolicy>
          <trust level="Custom" originUrl="" />
         </system.web>
    </location>
    
  8. サーバー上のアプリケーションによって変更されないように、位置の allowOverride 要素を false に設定することで、信頼レベルをロックします。

    <location allowOverride="false">
        <system.web>
          <securityPolicy>
           <trustLevel name="Full" policyFile="internal" />
           <trustLevel name="High" policyFile="web_hightrust.config" />
           <trustLevel name="Medium" policyFile="web_mediumtrust.config" />
           <trustLevel name="Low" policyFile="web_lowtrust.config" />
           <trustLevel name="Minimal" 
                       policyFile="web_minimaltrust.config" />
           <trustLevel name="Custom" policyFile="web_CustomTrust.config" />
          </securityPolicy>
          <trust level="Custom" originUrl="" />
         </system.web>
    </location>
    

リモート ファイル サーバーから提供されるようにコンテンツを構成する

リモート ファイル サーバーに格納されているコンテンツを処理するように ASP.NET を構成する場合には、追加のステップがいくつか必要です。

リモート ファイル サーバーからコンテンツを受信すると、IIS では認証されたユーザーを偽装します。 これは、仮想ディレクトリ ユーザーとして具体的に設定されたユーザーか、指定されていない場合は匿名ユーザーのいずれかです。 IIS ガイダンスでは、アプリケーション プール ユーザーを匿名ユーザーとして使用する必要があると述べているため、この場合、偽装した ID はアプリケーション プール ID です。 すべてのアクセス (匿名、アプリケーション プール、仮想ディレクトリ) に 1 つの ID を使用すると、展開が大幅に簡略化されます。

リモート ファイル サーバーから一部の ASP.NET アプリケーションを実行するには、偽装したユーザーが Windows の一時ディレクトリと一時コンパイル ディレクトリにアクセスできる必要があります。

ファイル サーバー共有から ASP.NET コンテンツを提供する方法

  1. フォルダーの ACL を編集して、すべてのアプリケーション プール ID のアクセス許可を %windir%\Temp ディレクトリに付与します。

  2. コード アクセス セキュリティ (CAS) ポリシーを追加して、ファイル サーバー共有への適切なアクセスを ASP.NET に許可します。 これを行うには、コマンド プロンプトを開き、次のコマンドを実行します。

    %windir%\Microsoft.NET\Framework\v2.0.50727\caspol -m -ag 1.  -url "file://\\remotefileserver\content$\*" FullTrust
    

ガベージ コレクター設定の構成

.NET フレームワークでは、自動ガベージ コレクションを使用して、すべてのアプリケーションのメモリを管理します。 十分なガベージが蓄積され、そうすることが効率的であると判断した場合、ガベージ コレクター (GC) でメモリを解放するためのコレクションが実行されます。 このプロセスは完全に自動ですが、プロセスの効率を高めることができる設定があります。

GC の詳細については、「第 5 章 - マネージド コード パフォーマンスの向上」の「ガベージ コレクションについて」のセクションを参照してください。

ワークステーション ガベージ コレクターの有効化

既定では、速度と CPU 負荷を最適化するために、.NET Framework でサーバー GC が使用されます。 共有ホスティングでは、アクティブなサイトの数に対してメモリに制約があることが多いため、ワークステーション GC を使用することをお勧めします。 ワークステーション GC はメモリを最適化します。

この設定の詳細については、サポート情報の記事「Windows Server 2003 を実行しているコンピューターで ASP.NET を使用する Web アプリケーションをホストすると、エラー メッセージが表示されたり、コンピューターが応答を停止したりする可能性がある」 (https://support.microsoft.com/kb/911716) を参照してください。

同時実行ガベージ コレクターの無効化

GC には、サーバー、ワークステーション (同時実行が有効)、ワークステーション (同時実行が無効) の 3 つのバージョンがあります。 同時実行ワークステーション GC は、クライアント シナリオを対象としています。 サーバー GC がメモリを犠牲にしてスループットとスケーラビリティを優先するのと同様に、同時実行ワークステーション GC はメモリを犠牲にして応答性を優先します。 メモリを最適化するには、ワークステーション GC を使用するときに同時実行ガベージ コレクションを無効にします。

gcTrimCommitOnLowMemory 設定の有効化

GC では将来の割り当てのためにメモリが保持されるので、コミットされる領域は厳密に必要な領域を超える可能性があります。 この領域は、システム メモリにかかる負荷が高くなる状況に対応するために、減らすことができます。 この設定が有効な場合、GC ではシステムのメモリ負荷を評価し、負荷が 90% に達するとトリミング モードに切り替わります。 負荷が 85% 未満になるまでトリミング モードは維持されます。 条件を満たしている場合、その設定でアプリケーションを助けずに無視することを GC で決定することができます。

GC の設定を構成する方法

  1. %windir%\Microsoft.NET\Framework\{version} ディレクトリに移動します。

  2. aspnet.config ファイルを開き、<gcServer> 要素を見つけます。 要素が存在しない場合は、ステップ 3 を使用してエントリを作成します。

    ...

    <configuration> 
    <runtime> 
    <gcServer enabled="true"/> 
    </runtime> 
    </configuration>
    ...
    
  3. <runtime> セクションに次の 3 つの要素を追加します。

    ...

    <configuration> 
    <runtime> 
    <gcServer enabled="false" />
    
    <gcConcurrent enabled="false" />
    <gcTrimCommitOnLowMemory enabled="true" />
    </runtime> 
    </configuration>
    ...
    
  4. ファイルを保存して閉じます。