web-dev-qa-db-ja.com

ASP.NET Core 2.0 Webアプリの展開とホスティング

環境

私のローカル開発環境は、Visual Studio 2017を使用するWindows 10 PCです。

注:現時点では、cpanelを介してのみWebサーバーにアクセスできます。ただし、ホスティングプロバイダーがASP.NET Core 2.0アプリの適切なサポートを提供できない場合は、サーバーとIISにフルアクセスできる専用サーバーへの変更を検討します。

私の要件/プロジェクト

.NET Core 2.0フレームワークをターゲットとするASP.NET Webアプリケーションを開発しており、アプリはlocalhostおよびIIS express。

これでアプリが完成したので、デプロイしてホストする必要があります。これは、数日から数週間で私の年齢を長引かせる困難な作業のように感じます。

多数の記事、ブログ、MSドキュメント、stackoverflowなどを介して、イントラネットとインターネットの両方に展開しようとする(多くの場合失敗する)ユーザーを読みました。今、.netコアを使用して公開および展開することは、まったくの混乱のように思えます。

私の現在のウェブサイトは、外部のパーティによって開発されました-PHPを使用するWordpressサイト。このサイトをASP.NET Core2.0 Webアプリケーションに置き換えたいです。

現在のサイトのルートは「httpdocs」です。ここには、他のアプリから参照する必要がある画像ファイルを含むサブフォルダーがいくつかあります。これらがそのままかどうか、またはASP.NET Webアプリが存在する新しいフォルダーに移行する必要があるかどうかはわかりません。サーバーに直接アクセスできません。cpanelを介してのみアクセスできます。

アプリにはhttpsが必要です。以下にStartup.csファイルとProgram.csファイルを含めました。

展開とホスティングに関与すると思われる手順と考慮事項の概要を説明しました。これを以前に経験したことがある人は私の質問を手伝ってくれますか、私が見逃したことや対処すべき他のことを教えてもらえますか?

Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container
    public void ConfigureServices(IServiceCollection services)
    {
        try
        {
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
                {
                    options.ExpireTimeSpan = new TimeSpan(90, 0, 0, 0);
                    options.LoginPath = new PathString("/Home/Index/");
                    options.AccessDeniedPath = new PathString("/Home/Index/");
                    options.LogoutPath = new PathString("/Home/Index/");
                    options.Validate();
                });

            services.AddMvc();
            services.AddAntiforgery();
            services.Configure<MvcOptions>(options =>
            {
                options.Filters.Add(new RequireHttpsAttribute());
            });
        }
        catch (Exception ex)
        {
            gFunc.ProcessError(ex);
        }
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline
// I've added a StaticFiles option that aims to make a directory called "SamadhiFiles" publically available
// so that I can use "http://mysite.net.au/samadhifiles/myPic.png
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        try
        {
            app.UseMvc();
            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "SamadhiFiles")),
                RequestPath = "/SamadhiFiles"
            });
            app.UseAuthentication();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
                app.UseStatusCodePages();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

    // this code is to enable redirection of http to https
            var options = new RewriteOptions().AddRedirectToHttps();
            app.UseRewriter(options);

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
        catch (Exception ex)
        {
            gFunc.ProcessError(ex);
        }
    }
}

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()            
            .UseIISIntegration()
            .UseKestrel()
            .Build();
}

UseIISIntegration()は、IISがKestrelの前でリバースプロキシとして機能することをASP.NETに伝えます。これは、Kestrelがリッスンするポート、転送ヘッダー、およびその他の詳細に関する設定も指定します。 UseKestrel()は、アプリケーションをホストするために使用されるサーバーとして、KestrelのIServerインターフェイスを登録します。

ここで何かを変更する必要があるのか​​、単にデフォールトオプションを使用するのかを確認します。

私は読んだ:マイクロソフトは、ASP.NETコアホスティングの公開サイトでIISを使用することをお勧めします。IISは、設定、管理、セキュリティ、 IISを使用することの大きな利点の1つは、プロセス管理です。IISは、アプリを自動的に起動し、 ASP.NET CoreアプリをWindowsサービスまたはコンソールアプリとして実行している場合は、プロセスを開始および監視するためのセーフティネットがありません。

launchSettings.json

公開する前にこのファイルの内容を変更する必要がありますか?または、アプリをフォルダーに公開すると、これは自動的に変更されますか?たとえば、ENVIRONMENTを「Production」に変更する必要がありますか、applicationUrlをWebサイトドメインに変更する必要がありますか?

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "https://localhost:44301/",
      "sslPort": 44376
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "CanvasWeb": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:61900/"
    }
  }
}

web.config(ASP.NET Coreの場合)

Web.configファイルは、IISがASP.NET Coreプロセスを起動する方法を定義する必要があります。たとえば、stdoutLogEnabled = trueを設定して出力ログを有効にし、ログを変更することもできますstdoutLogFileで構成された出力場所。

IIS構成は、リバースプロキシ構成に適用されるIIS機能のweb.configのセクションの影響を受けます。

私のASP.NET Core2プロジェクトには、現在「web.config」ファイルがありません。アプリを公開すると、このファイルは表示されますか?

フォルダに公開

Visual Studioから展開する場合、ドットネット公開ステップは、ファイルが展開先にコピーされる前に自動的に行われます。

発行フォルダーには、アプリの.exeファイルと.dllファイル、その依存関係、およびオプションで.NETランタイムが含まれています。 .exeおよび.dllファイルに加えて、ASP.NET Coreアプリの発行フォルダーには通常、構成ファイル、静的アセット、およびMVCビューが含まれています。

.NET Coreアプリは、自己完結型またはフレームワーク依存のアプリとして公開できます。アプリが自己完結型の場合、.NETランタイムを含む.dllファイルは発行フォルダーに含まれます。アプリがフレームワークに依存している場合、アプリにはサーバーにインストールされている.NETのバージョンへの参照があるため、.NETランタイムファイルは含まれません。

WindowsサーバーにIISをインストールするため、フレームワークに依存するデフォルトのデプロイメントモデルを使用する必要があると思います。

プロセスマネージャー

ASP.NET Coreアプリは、サーバーの起動時に起動し、クラッシュした場合は再起動する必要があるコンソールアプリです。起動と再起動を自動化するには、プロセスマネージャーが必要です。 LinuxでApacheを使用できることは知っていますが、この場合、IISを使用する必要があります。現在のサイトはWindowsサーバーです。

リバースプロキシのセットアップ

リバースプロキシを必要とするシナリオは、単一のサーバーで実行されている同じIPとポートを共有する複数のアプリケーションがある場合です。 Kestrelは複数のプロセス間で同じIPとポートを共有することをサポートしていないため、これはKestrelでは直接機能しません。ポートでリッスンするようにKestrelを構成すると、ホストヘッダーに関係なく、そのポートのすべてのトラフィックを処理します。ポートを共有できるリバースプロキシは、一意のIPとポートでケストレルに転送する必要があります。

MSによると、リバースプロキシサーバーを使用する他の理由があります。たとえば、負荷分散とSSLセットアップを簡素化します。リバースプロキシサーバーのみがSSL証明書を必要とし、そのサーバーはプレーンHTTPを使用して内部ネットワーク上のアプリケーションサーバーと通信できます。

。NET Core Windows Serverホスティングバンドルのインストール

アプリケーションをデプロイする前に、IIS=のホスティングマシンに.NET Coreホスティングバンドルをインストールする必要があります。これにより、.NET Coreランタイム、ライブラリ、およびIIS用ASP.NET Coreモジュール:インストール後、「net stop was/y」および「net start w3svc」を実行して、IISのすべての変更が確実に反映されるようにする必要があります。

私はcpanel経由でのみWebサーバーにアクセスできるため、ホスティングプロバイダーはこれを行う必要があると思います。

SSL証明書

Httpsを使用しているため、SSL証明書を購入してIISにインストールする必要があると思います。

IISセットアップ-IISでアプリケーションを作成

私はcpanel経由でのみWebサーバーにアクセスできるので、これもホスティングプロバイダーが行う必要があると思います。

  1. 新しいIISアプリケーションプールを作成します。「マネージコードなし」の.NET CLRバージョンの下に作成します。IISは、リバースプロキシ。実際には.NETコードを実行していません。
  2. 既存のIIS Siteの下に新しいアプリケーションを作成するか、新しいIISサイトを作成します。いずれにしても、新しいIISアプリケーションプールを開き、ASP.NET発行出力ファイルをコピーしたフォルダーをポイントします。
15
Ross Kelly

Nginxを調べましたが、必要なサポートを得ることができず、Linuxの経験はありません。

最終的に、ホスティングを新しいプロバイダー(VPS上の共有ホスティング)に変更することになりましたが、それでも良いサポートを得ることは悪夢でした。

結局のところ、launchSettings.jsonファイルに変更を加える必要はありませんでした。

私のweb.configファイルは次のようになりました:

    <?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\MyApplication.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>
<!--ProjectGuid: 4833e7c3-6fb8-4b3c-961f-f026b12af306-->

私の。csprojファイルは次のとおりです。

    <Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Aspose.Words" Version="18.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" />
    <PackageReference Include="System.ServiceModel.Duplex" Version="4.4.0" />
    <PackageReference Include="System.ServiceModel.Http" Version="4.4.0" />
    <PackageReference Include="System.ServiceModel.NetTcp" Version="4.4.0" />
    <PackageReference Include="System.ServiceModel.Security" Version="4.4.0" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" />
  </ItemGroup>

  <ItemGroup>
    <WCFMetadata Include="Connected Services" />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="wwwroot\CVFiles\" />
    <Folder Include="wwwroot\icons\" />
    <Folder Include="wwwroot\PictureFiles\" />
    <Folder Include="wwwroot\resources\" />
  </ItemGroup>

</Project>
3
Ross Kelly