著者は、 Open Source Initiative を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

ASP.NET Core は、最新のWebアプリケーションを構築するための高性能なオープンソースフレームワークであり、MicrosoftのASP.NETFrameworkのよりモジュール化されたバージョンを意味します。 2016年にリリースされ、LinuxやmacOSなどのいくつかのオペレーティングシステムで実行できます。 これにより、開発者は設計要件に基づいて特定のオペレーティングシステムを開発対象にすることができます。 ASP.NET Coreを使用すると、開発者は、複雑さやサイズに関係なく、あらゆる種類のWebアプリケーションまたはサービスを構築できます。 開発者は、 Razorページを利用して、従来の Model-View-Controller (MVC)パターンの上で機能するページに焦点を合わせたデザインを作成することもできます。

ASP.NET Coreは、フロントエンドフレームワークと統合して、クライアント側のロジックを処理したり、Webサービスを利用したりする柔軟性を提供します。 たとえば、 ASP.NET Coreを使用してRESTfulAPIを構築し、Angular、React、Vue.jsなどのJavaScriptフレームワークで簡単に使用できます。

このチュートリアルでは、Nginxを使用してUbuntu18.04上のMySQLサーバーで本番環境に対応したASP.NETコアアプリケーションをセットアップしてデプロイします。 GitHub でホストされている、Microsoftのドキュメントのアプリケーションと同様のデモASP.NETコアアプリケーションを展開します。 デプロイされると、デモアプリケーションを使用して、映画のリストを作成し、データベースに保存できます。 データベースからレコードを作成、読み取り、更新、および削除できるようになります。 このチュートリアルを使用して、代わりに独自のASP.NETコアアプリケーションを展開できます。 データベースの新しい移行ファイルの生成を含む追加の手順を実装する必要がある可能性があります。

前提条件

このチュートリアルでは、次のものが必要になります。

  • Ubuntu18.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu18.04サーバー。これには、sudoアクセス権を持つ非rootユーザーとファイアウォールが含まれます。
  • Ubuntu 18.04にNginxをインストールする方法に従って、Nginxをインストールします。
  • 保護されたNginxWebサーバー。 このチュートリアルは、 Ubuntu18.04でLet’sEncryptを使用してNginxを保護する方法について説明しています。
  • 次の両方のDNSレコードがサーバー用に設定されています。 それらを追加する方法の詳細については、この DigitalOceanDNSの紹介に従ってください。 サーバーのパブリックIPアドレスを指すyour-domainを含むAレコード。 サーバーのパブリックIPアドレスを指すwww.your-domainを含むAレコード。
  • Ubuntu18.04に最新のMySQLをインストールする方法に従ってインストールされたMySQL。

ステップ1—.NETCoreランタイムのインストール

.NETCoreアプリケーションを正常に実行するには.NETCoreランタイムが必要なので、これをマシンにインストールすることから始めます。 まず、MicrosoftKeyと製品リポジトリを登録する必要があります。 その後、必要な依存関係をインストールします。

まず、新しく作成したユーザーとしてログインし、ルートディレクトリにいることを確認します。

  1. cd ~

次に、次のコマンドを実行して、Microsoftキーと製品リポジトリを登録します。

  1. wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb

dpkg-iフラグを使用して、指定したファイルをインストールします。

  1. sudo dpkg -i packages-microsoft-prod.deb

アプリケーションに必要な他のパッケージのインストールを容易にするために、次のコマンドを使用してuniverseリポジトリをインストールします。

  1. sudo add-apt-repository universe

次に、apt-transportパッケージをインストールして、HTTPセキュアプロトコルを介してアクセスされるリポジトリを使用できるようにします。

  1. sudo apt install apt-transport-https

次に、次のコマンドを実行してリポジトリからパッケージリストをダウンロードし、それらを更新して、パッケージの最新バージョンとその依存関係に関する情報を取得します。

  1. sudo apt update

最後に、次のコマンドを使用して.NETランタイムSDKをインストールできます。

  1. sudo apt install dotnet-sdk-2.2

インストールされる追加ファイルのサイズの詳細が表示されます。 Yと入力し、ENTERを押して続行します。

サーバーへの.NETCoreランタイムSDKのインストールが完了したので、GitHubからデモアプリケーションをダウンロードして、展開構成をセットアップする準備がほぼ整いました。 ただし、最初に、アプリケーションのデータベースを作成します。

ステップ2—MySQLユーザーとデータベースを作成する

このセクションでは、MySQLサーバーユーザーを作成し、アプリケーションのデータベースを作成し、新しいユーザーがアプリケーションからデータベースに接続するために必要なすべての権限を付与します。

まず、次に示すように、MySQLルートアカウントを使用してMySQLクライアントにアクセスする必要があります。

  1. mysql -u root -p

前提条件のチュートリアルで設定したrootアカウントのパスワードを入力するように求められます。

次に、次のコマンドを使用してアプリケーションのMySQLデータベースを作成します。

  1. CREATE DATABASE MovieAppDb;

コンソールに次の出力が表示されます。

Output
Query OK, 1 row affected (0.03 sec)

これで、データベースが正常に作成されました。 次に、新しいMySQLユーザーを作成し、それらを新しく作成したデータベースに関連付けて、すべての権限を付与します。

次のコマンドを実行して、MySQLユーザーとパスワードを作成します。 ユーザー名とパスワードをより安全なものに変更することを忘れないでください。

  1. CREATE USER 'movie-admin'@'localhost' IDENTIFIED BY 'password';

次の出力が表示されます。

Output
Query OK, 0 rows affected (0.02 sec)

データベースにアクセスしたり、データベースに対して特定のアクションを実行したりするには、MySQLユーザーに適切な権限が必要です。 現在、movie-adminにはアプリケーションデータベースに対する適切な権限がありません。

次のコマンドを実行して、MovieAppDb上のmovie-adminへのアクセスを許可することでこれを変更します。

  1. GRANT ALL PRIVILEGES ON MovieAppDb.* TO 'movie-admin'@'localhost';

次の出力が表示されます。

Output
Query OK, 0 rows affected (0.01 sec)

これで、次のコマンドを実行して、flushステートメントを使用して行った変更を適用することにより、許可テーブルを再ロードできます。

  1. FLUSH PRIVILEGES;

次の出力が表示されます。

Output
Query OK, 0 rows affected (0.00 sec)

これで、新しいユーザーの作成と特権の付与が完了しました。 順調に進んでいるかどうかをテストするには、MySQLクライアントを終了します。

  1. quit;

作成したMySQLユーザーの資格情報を使用して再度ログインし、プロンプトが表示されたら適切なパスワードを入力します。

  1. mysql -u movie-admin -p

ユーザーmovie-adminが作成されたデータベースにアクセスできることを確認し、次のことを確認します。

  1. SHOW DATABASES;

出力にMovieAppDbテーブルが表示されます。

Output
+--------------------+ | Database | +--------------------+ | MovieAppDb | | information_schema | +--------------------+ 2 rows in set (0.01 sec)

ここで、MySQLクライアントを終了します。

  1. quit;

データベースを作成し、デモアプリケーション用の新しいMySQLユーザーを作成し、新しく作成したユーザーにデータベースにアクセスするための適切な権限を付与しました。 次のセクションでは、デモアプリケーションのセットアップを開始します。

ステップ3—デモアプリとデータベースのクレデンシャルを設定する

前述のように、既存のASP.NETコアアプリケーションを展開します。 このアプリケーションは、ムービーリストを作成するために構築され、Model-View-Controllerデザインパターンを使用して、適切な構造と関心の分離を保証します。 新しいムービーを作成またはリストに追加するには、ユーザーはフォームフィールドに適切な詳細を入力し、作成ボタンをクリックして詳細をコントローラーに投稿します。 この時点で、コントローラーは送信された詳細を含むPOST HTTPリクエストを受信し、モデルを介してデータベース内のデータを永続化します。

Git を使用して、このデモアプリケーションのソースコードを GitHub からプルし、新しいディレクトリに保存します。 別のアプリケーションをデプロイする場合は、ここから別のアプリケーションをダウンロードすることもできます。

まず、次のコマンドを使用して、ターミナルからmovie-appという名前の新しいディレクトリを作成します。

  1. sudo mkdir -p /var/www/movie-app

これは、アプリケーションのルートディレクトリとして機能します。 次に、root以外のユーザーアカウントがプロジェクトファイルを操作できるように、フォルダーの所有者とグループを変更します。

  1. sudo chown sammy:sammy /var/www/movie-app

sammyをsudoのroot以外のユーザー名に置き換えます。

これで、親ディレクトリに移動して、GitHubでアプリケーションのクローンを作成できます。

  1. cd /var/www
  2. git clone https://github.com/do-community/movie-app-list.git movie-app

次の出力が表示されます。

Output
Cloning into 'movie-app'... remote: Enumerating objects: 91, done. remote: Counting objects: 100% (91/91), done. remote: Compressing objects: 100% (73/73), done. remote: Total 91 (delta 13), reused 91 (delta 13), pack-reused 0 Unpacking objects: 100% (91/91), done.

GitHubからデモアプリケーションのクローンを作成できたので、次のステップは、アプリケーションデータベースへの接続を正常に作成することです。 これを行うには、appsettings.jsonファイル内のConnectionStringsプロパティを編集し、データベースの詳細を追加します。

ディレクトリをアプリケーションに変更します。

  1. cd movie-app

次に、ファイルを開いて編集します。

  1. sudo nano appsettings.json

データベースのクレデンシャルを追加します。

appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MovieContext": "Server=localhost;User Id=movie-admin;Password=password;Database=MovieAppDb"
  }
}

これで、データベースへの接続が正常に作成されました。 次に、CTRL+Xを押してファイルへの変更を保存し、Yと入力して確認します。 次に、ENTERを押してページを終了します。

ASP.NET コアアプリケーションは、 Entity Framework (EF)Coreという名前の.NET標準ライブラリを使用して、データベースとの対話を管理します。 Entity Framework Core は、人気のあるEntityFrameworkデータアクセステクノロジーの軽量なクロスプラットフォームバージョンです。 これは、.NET開発者がMySQLなどのデータベースプロバイダーのいずれかを使用してデータベースを操作できるようにするオブジェクトリレーショナルマッパー(ORM)です。

これで、複製されたデモアプリケーションのテーブルを使用してデータベースを更新できます。 その目的のために次のコマンドを実行します。

  1. dotnet ef database update

これにより、データベースに更新が適用され、適切なスキーマが作成されます。

ここで、プロジェクトとそのすべての依存関係をビルドするには、次のコマンドを実行します。

  1. dotnet build

次のような出力が表示されます。

Output
Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Core Copyright (C) Microsoft Corporation. All rights reserved. Restore completed in 95.09 ms for /var/www/movie-app/MvcMovie.csproj. MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.dll MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.Views.dll Build succeeded. 0 Warning(s) 0 Error(s) Time Elapsed 00:00:01.91

これにより、プロジェクトがビルドされ、project.assets.jsonファイルにリストされているサードパーティの依存関係がインストールされますが、アプリケーションはまだ本番環境に対応できません。 アプリケーションを展開できるようにするには、次のコマンドを実行します。

  1. dotnet publish

次のように表示されます。

Output
Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Core Copyright (C) Microsoft Corporation. All rights reserved. Restore completed in 89.62 ms for /var/www/movie-app/MvcMovie.csproj. MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.dll MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.Views.dll MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/

これにより、アプリケーションがパックおよびコンパイルされ、その依存関係が読み取られ、結果のファイルセットが展開用のフォルダーに公開され、インストールされた.NETCoreランタイムを使用してアプリケーションを実行するクロスプラットフォーム.dllファイルが生成されます。 。

依存関係をインストールし、データベースへの接続を作成し、必要なテーブルでデータベースを更新し、本番環境に公開することで、このデモアプリケーションのセットアップが完了しました。 次のステップでは、ドメインでアプリケーションにアクセスして安全にするようにWebサーバーを構成します。

ステップ4—Webサーバーの構成

これまでに、 Let’s EncryptチュートリアルでNginxを保護する方法を実行すると、/etc/nginx/sites-available/your_domainにドメインのサーバーブロックが作成され、server_nameディレクティブが適切に設定されます。 。 このステップでは、このサーバーブロックを編集して、Nginxをアプリケーションのリバースプロキシとして構成します。 リバースプロキシは、Webサーバーの前に配置され、すべてのWebブラウザーの要求をそれらのWebサーバーに転送するサーバーです。 ネットワークからすべてのリクエストを受信し、それらを別のWebサーバーに転送します。

ASP.NET コアアプリケーションの場合、Kestrelがデフォルトで含まれている優先Webサーバーです。 ASP.NET コアアプリケーションから動的コンテンツを提供するのに最適です。これは、要求処理のパフォーマンスが向上し、ASP.NETを可能な限り高速にするように設計されているためです。 ただし、Kestrelはセキュリティを管理して静的ファイルを提供できないため、フル機能のWebサーバーとは見なされません。そのため、常にWebサーバーの背後で実行することをお勧めします。

まず、サーバーのルートディレクトリ内にいることを確認します。

  1. cd ~

次のコマンドで編集するためにサーバーブロックを開きます。

  1. sudo nano /etc/nginx/sites-available/your_domain

Let’s EncryptチュートリアルでNginxを保護する方法のステップ4で詳しく説明されているように、オプション2を選択した場合、CertbotはHTTPトラフィックをHTTPSにリダイレクトするためにこのサーバーブロックを自動的に構成しますほんの少しの変更で。

以下を反映するようにファイルの最初の2つのブロックを編集して、構成を続行します。

/ etc / nginx / sites-available / your-domain
server {

    server_name your-domain  www.your-domain;

   location / {
	 proxy_pass http://localhost:5000;
	 proxy_http_version 1.1;
	 proxy_set_header Upgrade $http_upgrade;
	 proxy_set_header Connection keep-alive;
	 proxy_set_header Host $host;
	 proxy_cache_bypass $http_upgrade;
	 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	 proxy_set_header X-Forwarded-Proto $scheme;
	}

listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/your-domain/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/your-domain/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}
...

このサーバーブロックの構成は、SSLを使用するWebサイトの標準ポートであるポート443でリッスンするようにNginxに指示します。 さらに、Nginxはポート443でパブリックトラフィックを受け入れ、一致するすべてのリクエストをhttp://localhost:5000の組み込みのKestrelサーバーに転送します。

最後に、ファイルで編集したサーバーブロックに続いて、2番目のサーバーブロックが次のようになっていることを確認します。

/ etc / nginx / sites-available / your-domain

...
server {
if ($host = www.your-domain) {
    return 301 https://$host$request_uri;
} # managed by Certbot


if ($host = your-domain) {
    return 301 https://$host$request_uri;
} # managed by Certbot


    listen 80;
    listen [::]:80;

    server_name your-domain  www.your-domain;
return 404; # managed by Certbot
}

このサーバーブロックは、https://your-domainおよびhttps://www.your-domainへのすべてのリクエストを安全なHTTPSアクセスにリダイレクトします。

次に、次を実行して、サーバーブロックに加えた変更をNginxに強制的に取得させます。

  1. sudo nginx -s reload

Nginxの構成が正常に完了すると、サーバーは、https://your-domainに対して行われたすべてのHTTPS要求をhttp://localhost:5000のKestrelで実行されているASP.NETコアアプリに転送するように完全にセットアップされます。 。 ただし、NginxはKestrelサーバープロセスを管理するように設定されていません。 これを処理し、Kestrelプロセスがバックグラウンドで実行され続けるようにするには、systemd機能を使用します。

Systemd ファイルを使用すると、ユニットと呼ばれる作業プロセスを作成した後、開始、停止、再起動、およびログ機能を提供することでプロセスを管理できます。

systemdディレクトリに移動します。

  1. cd /etc/systemd/systems

編集用の新しいファイルを作成します。

  1. sudo nano movie.service

次のコンテンツを追加します。

movie.service
[Unit]
Description=Movie app

[Service]
WorkingDirectory=/var/www/movie-app
ExecStart=/usr/bin/dotnet /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/MvcMovie.dll
Restart=always
RestartSec=10
SyslogIdentifier=movie
User=sammy
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

構成ファイルは、WorkingDirectoryでプロジェクトのフォルダーの場所を指定し、ExecStartでプロセスの開始時に実行するコマンドを指定します。 さらに、RestartSecディレクティブを使用して、.NETランタイムサービスがクラッシュした場合にsystemdサービスをいつ再起動するかを指定しました。

次に、ファイルを保存し、次のコマンドで作成された新しいムービーサービスを有効にします。

  1. sudo systemctl enable movie.service

その後、サービスの開始に進み、サービスを開始してサービスが実行されていることを確認します。

  1. sudo systemctl start movie.service

次に、そのステータスを確認します。

  1. sudo systemctl status movie.service

次の出力が表示されます。

Output
movie.service - Movie app Loaded: loaded (/etc/systemd/system/movie.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2019-06-23 04:51:28 UTC; 11s ago Main PID: 6038 (dotnet) Tasks: 16 (limit: 1152) CGroup: /system.slice/movie.service └─6038 /usr/bin/dotnet /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/MvcMovie.dll

この出力は、アプリを実行し続けるために作成されたmovie.serviceの現在のステータスの概要を示します。 サービスが有効で、現在アクティブであることを示します。

ブラウザからhttps://your-domainに移動して、アプリケーションを実行およびテストします。

デモアプリケーションのホームページが表示されます—ムービーリストアプリケーション

Movie list application

リバースプロキシが構成され、Kestrelがsystemdを介して管理されると、Webアプリは完全に構成され、ブラウザーからアクセスできます。

結論

このチュートリアルでは、ASP.NETコアアプリケーションをUbuntuサーバーにデプロイしました。 データを永続化および管理するには、MySQLサーバーをインストールして使用し、NginxWebサーバーをリバースプロキシとして使用してアプリケーションを提供しました。

このチュートリアル以外に、Javascriptの代わりにC#を使用してインタラクティブなWebアプリケーションを構築することに興味がある場合は、Blazorと呼ばれるMicrosoftのWebUIフレームワークを試すことができます。 これは、ASP.NETコアアプリケーションのクライアント側にロジックを実装するためのイベント駆動型のコンポーネントベースのWebUIです。

独自のアプリケーションをデプロイする場合は、アプリをデプロイするために必要な他の手順を検討する必要があります。 このデモアプリケーションの完全なソースコードは、GitHubにあります。