Ubuntu 18.04でNginxを使用してMySQL ServerでASP.NET Coreアプリケーションをデプロイする方法

著者はhttps://www.brightfunds.org/organizations/open-source-initiative[Open Source Initiative]を選択して、https://do.co/w4do-cta [Donationsの書き込み]の一部として寄付を受け取りましたプログラム。

前書き

ASP.NET Coreは、最新のWebアプリケーションを構築するための高性能なオープンソースフレームワークであり、よりモジュール化されたバージョンであることが意図されています。 MicrosoftのASP.NET Frameworkの。 2016年にリリースされ、LinuxやmacOSなどの複数のオペレーティングシステムで実行できます。 これにより、開発者は設計要件に基づいて特定のオペレーティングシステムを開発対象にできます。 ASP.NET Coreを使用すると、開発者は複雑さとサイズに関係なく、あらゆる種類のWebアプリケーションまたはサービスを構築できます。 開発者は、https://docs.microsoft.com/en-us/aspnet/core/razor-pages/?view = aspnetcore-2.2&tabs = visual-studio [Razor pages]を使用して、ページ中心のデザイン作業を作成することもできます。従来のhttps://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller[Model-View-Controller](MVC)パターンの上。

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

このチュートリアルでは、Nginxを使用して、Ubuntu 18.04でMySQLサーバーを備えた実稼働対応のASP.NET Coreアプリケーションをセットアップしてデプロイします。 Microsoftのドキュメントのアプリケーションに類似し、https://github.com/aspnet/AspNetCore.Docs/tree/master/aspnetcore/tutorials/razor-pages/razor-pages-でホストされているデモASP.NET Coreアプリケーションをデプロイしますstart / 2.2-stage-samples [GitHub]。 デモアプリケーションをデプロイすると、ムービーのリストを作成してデータベースに保存できます。 データベースからレコードを作成、読み取り、更新、削除できます。 代わりに、このチュートリアルを使用して独自のASP.NET Coreアプリケーションを展開できます。データベースの新しい移行ファイルの生成を含む追加の手順を実装する必要がある可能性があります。

前提条件

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

手順1-.NET Coreランタイムのインストール

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

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

cd ~

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

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

指定されたファイルをインストールするには、「-i +」フラグとともに「 dpkg +」を使用します。

sudo dpkg -i packages-microsoft-prod.deb

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

sudo add-apt-repository universe

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

sudo apt install apt-transport-https

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

sudo apt update

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

sudo apt install dotnet-sdk-2.2

インストールされる追加ファイルのサイズの詳細が求められます。 「+ A 」と入力し、「 ENTER」を押して続行します。

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

ステップ2-MySQLユーザーとデータベースの作成

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

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

mysql -u root -p

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

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

CREATE DATABASE ;

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

OutputQuery OK, 1 row affected (0.03 sec)

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

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

CREATE USER ''@'localhost' IDENTIFIED BY '';

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

OutputQuery OK, 0 rows affected (0.02 sec)

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

次のコマンドを実行して、 `++`の* movie-admin *へのアクセスを許可することにより、これを変更します。

GRANT ALL PRIVILEGES ON .* TO ''@'localhost';

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

OutputQuery OK, 0 rows affected (0.01 sec)

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

FLUSH PRIVILEGES;

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

OutputQuery OK, 0 rows affected (0.00 sec)

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

quit;

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

mysql -u  -p

ユーザー* movie-admin *が作成されたデータベースにアクセスできることを確認するためにチェックします:

SHOW DATABASES;

出力にリストされた `++`テーブルが表示されます。

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

次に、MySQLクライアントを終了します。

quit;

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

手順3-デモアプリとデータベース資格情報の設定

前述のように、既存のASP.NET Coreアプリケーションをデプロイします。 このアプリケーションは、ムービーリストを作成するために構築され、Model-View-Controllerデザインパターンを使用して、適切な構造と懸念事項の分離を保証します。 リストに新しいムービーを作成または追加するには、ユーザーがフォームフィールドに適切な詳細を入力し、[作成]ボタンをクリックして詳細をコントローラーに送信します。 この時点でコントローラーは、送信された詳細を含むPOST HTTP要求を受信し、モデルを通じてデータベースにデータを保持します。

Gitを使用して、このデモアプリケーションのソースコードをhttps://github.com/do-community/movie-app-list[GitHub]から取得して保存します。新しいディレクトリ。 別のアプリケーションを展開する場合は、ここから代替アプリケーションをダウンロードすることもできます。

開始するには、次のコマンドを使用して、ターミナルから「++」という名前の新しいディレクトリを作成します。

sudo mkdir -p /var/www/

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

sudo chown : /var/www/
  • sammy *をsudoの非ルートユーザー名に置き換えます。

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

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

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

OutputCloning into ''...
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`ファイル内の + ConnectionString`プロパティを編集し、データベースの詳細を追加します。

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

cd

編集用にファイルを開きます。

sudo nano appsettings.json

データベース資格情報を追加します。

appsettings.json

{
 "Logging": {
   "LogLevel": {
     "Default": "Warning"
   }
 },
 "AllowedHosts": "*",
 "ConnectionStrings": {
   "MovieContext": "Server=localhost;User Id=;Password=;Database="
 }
}

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

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

これで、クローンデモアプリケーションのテーブルでデータベースを更新できます。 そのために次のコマンドを実行します。

dotnet ef database update

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

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

dotnet build

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

OutputMicrosoft (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//MvcMovie.csproj.
 MvcMovie -> /var/www//bin/Debug/netcoreapp2.2/MvcMovie.dll
 MvcMovie -> /var/www//bin/Debug/netcoreapp2.2/MvcMovie.Views.dll

Build succeeded.
   0 Warning(s)
   0 Error(s)

Time Elapsed 00:00:01.91

これにより、プロジェクトがビルドされ、「++」ファイルにリストされているサードパーティの依存関係がインストールされますが、アプリケーションはまだ本番の準備ができていません。 アプリケーションを展開する準備を整えるには、次のコマンドを実行します。

dotnet publish

以下が表示されます。

OutputMicrosoft (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//bin/Debug/netcoreapp2.2/MvcMovie.dll
MvcMovie -> /var/www//bin/Debug/netcoreapp2.2/MvcMovie.Views.dll
MvcMovie -> /var/www//bin/Debug/netcoreapp2.2/publish/

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

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

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

これまでに、https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04 [Nginxをセキュリティで保護するには暗号化チュートリアル]、 `+`ディレクティブが既に適切に設定された ` / etc / nginx / sites-available / +`にドメインのサーバーブロックがあります。 この手順では、このサーバーブロックを編集して、アプリケーションのリバースプロキシとしてNginxを構成します。 リバースプロキシは、ウェブサーバーの前に配置され、すべてのウェブブラウザのリクエストをそれらのウェブサーバーに転送するサーバーです。 ネットワークからすべてのリクエストを受信し、それらを別のWebサーバーに転送します。

ASP.NET Coreアプリケーションの場合、https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view = aspnetcore-2.2 [Kestrel]が優先されるWebサーバーですデフォルトで含まれています。 ASP.NET Coreアプリケーションから動的コンテンツを提供するのに最適です。リクエスト処理のパフォーマンスが向上し、ASP.NETを可能な限り高速にするように設計されているためです。 ただし、Kestrelはセキュリティを管理できず、静的ファイルを提供できないため、フル機能のWebサーバーとは見なされません。そのため、常にWebサーバーの背後で実行することをお勧めします。

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

cd ~

サーバーブロックを開いて編集します。

sudo nano /etc/nginx/sites-available/

https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04#step-4-%E2%80で詳述されているようにhttps://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-の%94-obtaining-an-ssl-certificate [ステップ4] 18-04 [Let’s EncryptチュートリアルでNginxを保護する方法]、オプション2を選択した場合、Certbotは、わずかな変更でHTTPトラフィックをHTTPSにリダイレクトするためにこのサーバーブロックを自動的に構成します。

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

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

server {

   server_name   www.;

  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//fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live//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.) {
   return 301 https://$host$request_uri;
} # managed by Certbot


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


   listen 80;
   listen [::]:80;

   server_name   www.;
return 404; # managed by Certbot
}

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

次に、次のコマンドを実行して、サーバーブロックに加えた変更をNginxに強制的に適用させます。

sudo nginx -s reload

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

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

`+ systemd +`ディレクトリに移動します:

cd /etc/systemd/systems

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

sudo nano

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

movie.service

[Unit]
Description=

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

[Install]
WantedBy=multi-user.target

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

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

sudo systemctl enable

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

sudo systemctl start

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

sudo systemctl status

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

Output -
  Loaded: loaded (/etc/systemd/system/; 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/
          └─6038 /usr/bin/dotnet /var/www//bin/Debug/netcoreapp2.2/publish/MvcMovie.dll

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

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

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

image:https://i.imgur.com/VI7KTaU.png [ムービーリストアプリケーション]

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

結論

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

このチュートリアルを超えて、Javascriptの代わりにC#を使用してインタラクティブなWebアプリケーションを構築することに興味がある場合は、https://dotnet.microsoft.com/apps/aspnet/web-apps/client [ブレイザー]。 これは、ASP.NET Coreアプリケーションのクライアント側にロジックを実装するためのイベント駆動型コンポーネントベースのWeb UIです。

独自のアプリケーションをデプロイする場合は、アプリをデプロイするために必要な他の手順を考慮する必要があります。 このデモアプリケーションの完全なソースコードは、https://github.com/do-community/movie-app-list [GitHubのこちら]にあります。

前の投稿:DigitalOceanでKryptoniteを使用してSSHで安全に接続する方法
次の投稿:CentOS 7でBINDをプライベートネットワークDNSサーバーとして構成する方法