IISに公開し、環境変数を設定する


134

これら2つの質問と回答を読んで、Asp.net 5アプリをIIS 8.5サーバーで実行することができました。

Asp.net vNext初期ベータ版がWindowsサーバーのIISに公開

MVC6アプリをIISで動作するように構成するにはどうすればよいですか?

問題は、IISで実行されている場合でも、Webアプリがまだenv.EnvironmentName値を使用していることDevelopmentです。

また、同じWebの2つのバージョン(ステージング、プロダクション)を同じサーバーで実行したいので、各Webの変数を個別に設定するメソッドが必要です。

これを行う方法?


4
1つには、通常、開発、ステージング、本番の3つのネットワーク環境があります。Webサーバーは1つの環境にあります。したがって、サーバーのシステム環境変数の設定は、通常、実際の制限ではありません。Visual Studioでデバッグするために、別の環境Properties\launchSettings.jsonシミュレートするために引き続き使用できます。
Oleg

回答:


286

この回答は元々ASP.NET Core RC1用に書かれました。RC2では、ASP.NET Coreが汎用のhttpPlafromハンドラーからaspnetCore固有のハンドラーに移動しました。手順3は、使用しているASP.NET Coreのバージョンによって異なることに注意してください。

ユーザーの環境変数を設定したり、複数のコマンドエントリを作成したりすることなく、ASP.NET Coreプロジェクトの環境変数を設定できることがわかりました。

  1. IISでアプリケーションに移動し、を選択しますConfiguration Editor
  2. 選択する Configuration Editor
  3. 選択してくださいsystem.webServer/aspNetCore(RC2およびRTM)またはsystem.webServer/httpPlatform中(RC1)Sectionコンボボックスを
  4. コンボボックスで選択Applicationhost.config ...Fromます。
  5. enviromentVariables要素を右クリックして、を選択し'environmentVariables' element、をクリックしますEdit Itemsここに画像の説明を入力してください
  6. 環境変数を設定します。
  7. ウィンドウを閉じて、[適用]をクリックします。
  8. できた

これにより、プールに特別なユーザーを作成したり、で追加のコマンドエントリを作成したりする必要がなくなりますproject.json。また、環境ごとに特別なコマンドを追加すると、「1回ビルドして何度もデプロイ」が機能しdnu publishなくなります。これは、1回公開してアーティファクトを何度もデプロイする代わりに、環境ごとに個別に呼び出す必要があるためです。

Mark Gとtredderのおかげで、RC2とRTM用に更新されました。


12
ステップ3 system.webServer/aspNetCoreでは代わりに使用しました。
マークG

1
システム環境変数は、起動時にプロセスによって継承されます。したがって、アプリケーションの実行中に環境変数を変更すると、デフォルトではこの変更を確認できなくなります。システム環境変数の変更を有効にするには、IISがプロセスを作成する方法に応じて、少なくともサイト、おそらくプール、またはIISサービスを再起動する必要があります。これはテストする必要があります。
NickAb 2017年

7
構成エディターを介して追加された設定は、次の展開で消去されませんか?
Brad Gardner 2017年

11
@ brad-gardner web.configではなくApplicationhost.configに変更が加えられた場合、変更はデプロイメント間で保持されます。
NickAb 2017年

15
Asp.Net Core 2.0に対応
フランクキャノン

34

<aspNetCore>の下の< environmentVariables>セクションでweb.configを更新します。

<configuration>
  <system.webServer>
    <aspNetCore .....>
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

または、web.configを上書きするときにこの設定が失われないようにするには、@ NickAbが示すように、サイトの場所を指定してapplicationHost.configに同様の変更を加えます

<location path="staging.site.com">
    <system.webServer>
        <aspNetCore>
            <environmentVariables>
                <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
            </environmentVariables>
        </aspNetCore>
    </system.webServer>
</location>
<location path="production.site.com">
    <system.webServer>
        <aspNetCore>
            <environmentVariables>
                <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
            </environmentVariables>
        </aspNetCore>
    </system.webServer>
</location>

2
これは、web.configがプロジェクトの一部であり、VCSでバージョン管理されるという点で異なります。prod、staging、devなどの複数の環境がある場合、それぞれの環境でweb.configを変換する方法が必要になります。IISでApplicationHost.configを変更しても、影響を受けるのはこのIISだけです。そのため、VCSに単一のweb.configを設定し、web.config変数を上書きするIIS固有の環境変数を設定できます。ApplicationHost.configは、PowerShelliis.net /learn
manage/

@NickAbに感謝します。デプロイごとにweb.configを更新する必要がありません。回答を更新しました。
Trevor Daniels 2016年

私はPowershellからこれを行うことに問題がTarget configuration object '/system.webServer/aspNetCore/environmentVariables/environmentVariable is not found ... あります私は通常、いくつかの変数を設定するためにこれを書きます:私はSet-WebConfigurationProperty -PSPath IIS:\ -location example.com -filter /system.webServer/aspNetCore/environmentVariables/environmentVariable -name ASPNETCORE_ENVIRONMENT -value Staging 何を失っていますか?
クリスチャン

私は知っているものに戻り、appcmd代わりに使用しました。
クリスチャン

@Christian、この答えを確認してください:stackoverflow.com/a/50869935/33533環境変数の名前と値はハッシュテーブルに入るので、例ではSet-WebConfigurationProperty -PSPath IIS:\ -Location example.com -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = 'Staging' }
Curtis Buys

21

編集:RC2およびRTMリリースの時点では、このアドバイスは古くなっています。リリースでこれを達成するために見つけた最良の方法は、各環境のIISで次のweb.configセクションを編集することです。

system.webServer/aspNetCore

environmentVariableエントリーを編集して、環境変数設定を追加します。

ASPNETCORE_ENVIRONMENT< Your environment name >


drpdrpのアプローチの代わりに、以下を実行できます。

  • project.jsonに、ASPNET_ENV変数を直接Kestrelに渡すコマンドを追加します。

    "commands": {
        "Development": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Development",
        "Staging": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Staging",
        "Production": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Production"
    }
    
  • 公開するときに、--iis-commandオプションを使用して環境を指定します。

    dnu publish --configuration Debug --iis-command Staging --out "outputdir" --runtime dnx-clr-win-x86-1.0.0-rc1-update1
    

このアプローチは、追加のIISユーザーを作成するよりも煩わしくないことがわかりました。


11
Visual Studioのmsdeployを通じて公開する場合。次に、<IISCommand> Staging </ IISCommand>を.pubxmlファイルに入れると、発行UIで指定できない場合でも、指定されたIISコマンドを使用してデプロイされます。
ディーンノース

@DeanNorth-これは黄金です!! チャンピオンのように機能します!共有してくれてありがとう!
S.ラスムッセン2016

17

IIS WebサーバーでホストされているWebアプリケーション(本番環境、ステージング、テスト)を持っています。したがって、特定の値(たとえば、STAGING)に設定すると他のアプリケーションに影響を与えるため、ASPNETCORE_ENVIRONMENT operativeのシステム環境変数に依存することはできませんでした。

回避策として、私はvisualstudioソリューション内でカスタムファイル(envsettings.json)を定義しました。

ここに画像の説明を入力してください

次の内容で:

{
  // Possible string values reported below. When empty it use ENV variable value or Visual Studio setting.
  // - Production
  // - Staging
  // - Test
  // - Development
  "ASPNETCORE_ENVIRONMENT": ""
}

次に、アプリケーションの種類(運用、ステージング、またはテスト)に基づいて、このファイルを適切に設定します。テストアプリケーションを展開しているとすると、次のようになります。

"ASPNETCORE_ENVIRONMENT": "Test"

その後、Program.csファイルでこの値を取得し、webHostBuilderの環境を設定します。

    public class Program
    {
        public static void Main(string[] args)
        {
            var currentDirectoryPath = Directory.GetCurrentDirectory();
            var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
            var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
            var enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();

            var webHostBuilder = new WebHostBuilder()
                .UseKestrel()
                .CaptureStartupErrors(true)
                .UseSetting("detailedErrors", "true")
                .UseContentRoot(currentDirectoryPath)
                .UseIISIntegration()
                .UseStartup<Startup>();

            // If none is set it use Operative System hosting enviroment
            if (!string.IsNullOrWhiteSpace(enviromentValue)) 
            { 
                webHostBuilder.UseEnvironment(enviromentValue);
            }

            var host = webHostBuilder.Build();

            host.Run();
        }
    }

envsettings.jsonをpublishOptions(project.json)に含めることを忘れないでください。

  "publishOptions":
  {
    "include":
    [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "envsettings.json",
      "appsettings.json",
      "appsettings*.json",
      "web.config"
    ]
  },

このソリューションにより、環境変数の値に関係なく、ASP.NET COREアプリケーションを同じIISで自由にホストできます。


非常に良い、私が提案する唯一の変更はswap var currentDirectoryPath = Directory.GetCurrentDirectory();です。for var currentDirectoryPath = PlatformServices.Default.Application.ApplicationBasePath; これは、現在のディレクトリを取得するより安全な方法です。
Peter Kottas 2017

7
フレームワークの構成を管理するために構成の別のレイヤーを作成する必要がある場合、すぐに使えるすばらしいエクスペリエンス
Kugel

16

広範囲にググリングした後、私は2つのステップからなる実用的な解決策を見つけました。

最初のステップは、システム全体の環境変数ASPNET_ENVをProductionに設定し、Windowsサーバー再起動することです。この後、すべてのWebアプリはEnvironmentNameとして値「Production」を取得します。

2番目の手順(ステージングWebの値「Staging」を有効にする)は、正しく機能させるのがかなり困難でしたが、次のようになります。

  1. サーバーにStagingPoolなどの新しいWindowsユーザーを作成します。
  2. このユーザーに対して、値 'Staging'の新しいユーザー変数ASPNETCORE_ENVIRONMENTを作成します(このユーザーとしてログインするか、regeditを使用して実行できます)
  3. IISマネージャーで管理者として戻り、ステージングWebが実行されているアプリケーションプールを見つけ、[詳細設定]で[ID]をユーザーStagingPoolに設定します。
  4. また、Load User Profiletrueに設定すると、環境変数がロードされます。<-非常に重要です!
  5. StagingPoolに Webフォルダーへのアクセス権があり、アプリケーションプールを停止および開始できることを確認します。

これで、ステージングWebのEnvironmentNameが 'Staging'に設定されます。

更新:Windows 7以降では、指定したユーザーに対してもCMDプロンプトから環境変数を設定できるコマンドがあります。この出力は、サンプルとヘルプに役立ちます。

>setx /?

1
ASP.NET 5 RC1では、環境変数がHosting:Environmentに変更されたようです。
Grady Werner

これをAzure Web Appにデプロイするときに、「ユーザープロファイルの読み込み」をどのようにtrueに設定しますか?
Puneet Ghanshani、2015

@PunitGanshani私が理解しているように、環境のキーと値のペアを設定できるWebアプリのazureポータルに「アプリケーション設定」セクションがあります。azure.microsoft.com
us

@GradyWerner RC2の場合、彼らは(現在のところ)ASPNET_ENVIRONMENTに変更しています;-)
b.pell

1
@ b.pell現在ASPNETCORE_ENVIRONMENTになっているようです:)
Mark G

11

またはASPNETCORE_ENVIRONMENT、次のコマンドを使用して、必要なものを引数としてdotnet publishコマンドに渡すこともできます。

/p:EnvironmentName=Staging

例えば:

dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging

これにより、プロジェクトに指定された正しい環境でweb.configが生成されます。

<environmentVariables>
  <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>

9

上記のオプション以外にも、自動展開で適切に機能するか、構成の変更が少ないソリューションがいくつかあります。

1.プロジェクトファイル(.CsProj)ファイルの変更

MSBuildは、EnvironmentName展開する環境ごとに適切な環境変数を設定するのに役立つプロパティをサポートしています。環境名は、公開フェーズ中にweb.configに追加されます。

プロジェクトファイル(* .csProj)を開き、次のXMLを追加するだけです。

<!-- Custom Property Group added to add the Environment name during publish
  The EnvironmentName property is used during the publish for the Environment variable in web.config
  -->
  <PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
    <EnvironmentName>Development</EnvironmentName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
    <EnvironmentName>Production</EnvironmentName>
  </PropertyGroup>

上記のコードはDevelopment、デバッグ構成の場合、または構成が指定されていない場合に、環境名を追加します。その他の構成の場合、環境名はProduction生成されたweb.configファイルに含まれます。詳細はこちら

2.パブリッシュプロファイルにEnvironmentNameプロパティを追加します。

<EnvironmentName>プロパティをパブリッシュプロファイルに追加することもできます。にある発行プロファイルファイルを開きます。これProperties/PublishProfiles/{profilename.pubxml}により、プロジェクトの発行時にweb.configに環境名が設定されます。詳細はこちら

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

3. dotnet publishを使用したコマンドラインオプション

さらに、プロパティEnvironmentNameをコマンドラインオプションとしてコマンドに渡すことができますdotnet publish。次のコマンドにはDevelopment、web.configファイルのように環境変数が含まれます。

dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development


7

@tredderの答えを拡張するには、使用してenvironmentVariablesを変更できます appcmd

演出

%windir%\system32\inetsrv\appcmd set config "staging.example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Staging'] /commit:APPHOST

製造

%windir%\system32\inetsrv\appcmd set config "example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production'] /commit:APPHOST


IISがインストールされていないビルドサーバーでPowershellを使用して同じことを行う方法は次のとおりです。gist.github.com/markarnott/c4aec1fc544fe89e2bd21f3f00d78933
Mark Arnott

「staging.example.com」または「example.com」を指定すると、それらの特定のWebサイトにのみ変数が適用されます。これを省略すると、サーバー上のすべてのWebサイトに対してグローバル変数が作成されます。
deadlydog

6

1か所で知っておくべきこと:

  • 環境変数で設定を上書きするには、プレフィックスにを付ける必要がありますASPNETCORE_
  • JSON設定の子ノードを一致させる場合は、セパレータ:として使用します。プラットフォームで環境変数キーにコロンを使用できない場合は、__代わりに使用してください。
  • 設定を最終的ににしたいApplicationHost.config。IIS構成エディターを使用すると、入力がアプリケーションに書き込まれWeb.config、次の展開で上書きされます!
  • を変更するApplicationHost.config場合は、を使用appcmd.exeして、変更の一貫性を確保する必要があります。例:%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /+"environmentVariables.[name='ASPNETCORE_AWS:Region',value='eu-central-1']" /commit:site

  • URLセーフでない文字は%u007b、左中括弧のようにUnicodeとしてエスケープできます。

  • 現在の設定を一覧表示するには(Web.configの値と組み合わせて): %systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
  • 同じキーに対して設定キーを複数回設定するコマンドを実行すると、複数回追加されます!既存の値を削除するには、などを使用します%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /-"environmentVariables.[name='ASPNETCORE_MyKey',value='value-to-be-removed']" /commit:site

1
そのノート/commit:siteの変更は、web.configファイルに書かれているが、それらを保存するために、ApplicationHost.config1使用する必要があります/commit:apphost
エンジェルYordanov

-section:system.webServer/aspNetCore /-"environmentVariables.(環境変数を削除するためにマイナスを使用)は、Azureリリースパイプラインの実行中に失敗します。エラーはhresult:80070032, message:Command execution failedです。ただし、clear config "Default Web Site/$(webSiteName)" -section:system.webServer/aspNetCore /commit:site正常に動作します。WebサイトのaspNetCoreセクション全体をクリアしますが、リリース中にパラメーター化されるため、問題ありません。
oleksa

6

他の回答と同様に、ASP.NET Core 2.1環境の設定が展開全体で維持されるようにしたかったが、特定のサイトにのみ適用された。

Microsoftのドキュメントによると、IIS 10で次のPowerShellコマンドを使用して、アプリプールに環境変数を設定することが可能です。

$appPoolName = "AppPool"
$envName = "Development"
cd "$env:SystemRoot\system32\inetsrv"
.\appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='$appPoolName'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='$envName']" /commit:apphost

残念ながら、私はまだIIS 8.5を使用する必要があり、運が悪いと思っていました。ただし、単純なPowerShellスクリプトを実行して、ASPNETCORE_ENVIRONMENTのサイト固有の環境変数値を設定することは引き続き可能です。

Import-Module -Name WebAdministration
$siteName = "Site"
$envName = "Development"
Set-WebConfigurationProperty -PSPath IIS:\ -Location $siteName -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = $envName }

5

applicationHost.configを編集する @tredderソリューションは、IISの仮想ディレクトリ内に複数の異なるアプリケーションがある場合に機能するソリューションです。

私の場合:

  • 私はAPIプロジェクトとAPPプロジェクトを同じドメインの下で別の仮想ディレクトリに配置しています
  • ルートページXXXが仮想ディレクトリの子にASPNETCORE_ENVIRONMENT変数を伝達していないようです...
  • ...仮想ディレクトリ内の変数を@NickAbの説明どおりに設定できません(エラーが発生しましたリクエストはサポートされていません(構成エディターでの変更の保存中にHRESULTからの例外:0x80070032)):
  • applicationHost.configに移動し、次のようなノードを手動で作成します

    <location path="XXX/app"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location> <location path="XXX/api"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location>

そして、IISを再起動することでその仕事が完了しました。


0

エラーの詳細を取得するには、対応するアプリケーションプールの環境変数追加するASPNETCORE_ENVIRONMENT必要がありました system.applicationHost/applicationPools

注:私の場合、WebアプリケーションはでASP.NET Core 2ホストされてIIS 10いるWebアプリケーションでした。これはConfiguration Editor、in を介して行うことができますIIS Manager構成エディターを使用したコレクションの編集を参照して、このエディターの場所をで確認してくださいIIS Manager)。


0

Web.configの環境設定でIISを公開するためのリポジトリを作成しました。

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • セットアップ
    • .csprojおよび.user.csprojファイルからセクションをプロジェクトファイルに取得します。
    • MyAspNetEnvironment.props、web.development.config、web.production.configファイルを取得します。
  • 構成
    • user.csprojのASPNETCORE_ENVIRONMENTプロパティの値を適切に変更します。

これは質問に対する質の高い答えを提供するようには思えません。回答を編集してこのソリューションの全体的な詳細を追加するか、それを削除して質問へのコメントとして投稿してください。ありがとう!
sɐunıɔןɐqɐp

0

@Christian Del Biancoの回答を変更しました。.netコア2以降のプロセスをproject.jsonファイルとして絶対に変更しました。

  1. まず、ルートディレクトリにappsettings.jsonファイルを作成します。内容で

      {
         // Possible string values reported below. When empty it use ENV 
            variable value or Visual Studio setting.
         // - Production
         // - Staging
         // - Test
        // - Development
       "ASPNETCORE_ENVIRONMENT": "Development"
     }
    
  2. 次に、必要な構成を使用して、別の2つの設定ファイルappsettings.Development.jsonappsettings.Production.jsonを作成します。

  3. Program.csファイルに環境を設定するために必要なコードを追加します。

    public class Program
    {
    public static void Main(string[] args)
    {
        var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    
      ***var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();***
    
        try
        {
            ***CreateWebHostBuilder(args, enviromentValue).Build().Run();***
        }
        catch (Exception ex)
        {
            //NLog: catch setup errors
            logger.Error(ex, "Stopped program because of setup related exception");
            throw;
        }
        finally
        {
            NLog.LogManager.Shutdown();
        }
    }
    
    public static IWebHostBuilder CreateWebHostBuilder(string[] args, string enviromentValue) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
            })
            .UseNLog()
            ***.UseEnvironment(enviromentValue);***
    

    }

  4. envsettings.json.csprojファイルに追加して、公開ディレクトリにコピーします。

       <ItemGroup>
            <None Include="envsettings.json" CopyToPublishDirectory="Always" />
        </ItemGroup>
    
  5. 次に、envsettings.jsonファイルで必要に応じASPNETCORE_ENVIRONMENTを変更して公開します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.