Ubuntu18.04でNginxを使用してMySQLサーバーでASP.NETCoreアプリケーションを展開する方法
序章
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コアアプリケーションをセットアップしてデプロイします。 Microsoftのドキュメントにあるアプリケーションと同様のデモASP.NETコアアプリケーションをデプロイし、GitHubでホストします。 デプロイされると、デモアプリケーションを使用して、映画のリストを作成し、データベースに保存できます。 データベースからレコードを作成、読み取り、更新、および削除できるようになります。 このチュートリアルを使用して、代わりに独自のASP.NETコアアプリケーションを展開できます。 データベースの新しい移行ファイルの生成を含む追加の手順を実装する必要がある可能性があります。
前提条件
このチュートリアルでは、次のものが必要になります。
- Ubuntu18.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu18.04サーバー。
sudo
アクセスとファイアウォール。 - Ubuntu 18.04にNginxをインストールする方法に従って、Nginxをインストールします。
- 保護されたNginxWebサーバー。 このチュートリアルは、 Ubuntu18.04でLet’sEncryptを使用してNginxを保護する方法について説明しています。
- 次の両方のDNSレコードがサーバー用に設定されています。 それらを追加する方法の詳細については、この DigitalOceanDNSの紹介に従ってください。
- アン
A
で記録するyour-domain
サーバーのパブリックIPアドレスを指します。 - アン
A
で記録するwww.your-domain
サーバーのパブリックIPアドレスを指します。
- アン
- Ubuntu18.04に最新のMySQLをインストールする方法に従ってインストールされたMySQL。
ステップ1—.NETCoreランタイムのインストール
.NETCoreアプリケーションを正常に実行するには.NETCoreランタイムが必要なので、これをマシンにインストールすることから始めます。 まず、MicrosoftKeyと製品リポジトリを登録する必要があります。 その後、必要な依存関係をインストールします。
まず、新しく作成したユーザーとしてログインし、ルートディレクトリにいることを確認します。
- cd ~
次に、次のコマンドを実行して、Microsoftキーと製品リポジトリを登録します。
- wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
使用する dpkg
とともに -i
指定されたファイルをインストールするためのフラグ:
- 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
インストールされる追加ファイルのサイズの詳細が表示されます。 タイプ Y
とヒット ENTER
続ける。
サーバーへの.NETCoreランタイムSDKのインストールが完了したので、GitHubからデモアプリケーションをダウンロードして、展開構成をセットアップする準備がほぼ整いました。 ただし、最初に、アプリケーションのデータベースを作成します。
ステップ2—MySQLユーザーとデータベースを作成する
このセクションでは、MySQLサーバーユーザーを作成し、アプリケーションのデータベースを作成し、新しいユーザーがアプリケーションからデータベースに接続するために必要なすべての権限を付与します。
まず、次に示すように、MySQLルートアカウントを使用してMySQLクライアントにアクセスする必要があります。
- mysql -u root -p
前提条件のチュートリアルで設定したrootアカウントのパスワードを入力するように求められます。
次に、次のコマンドを使用してアプリケーションのMySQLデータベースを作成します。
- CREATE DATABASE MovieAppDb;
コンソールに次の出力が表示されます。
OutputQuery OK, 1 row affected (0.03 sec)
これで、データベースが正常に作成されました。 次に、新しいMySQLユーザーを作成し、それらを新しく作成したデータベースに関連付けて、すべての権限を付与します。
次のコマンドを実行して、MySQLユーザーとパスワードを作成します。 ユーザー名とパスワードをより安全なものに変更することを忘れないでください。
- CREATE USER 'movie-admin'@'localhost' IDENTIFIED BY 'password';
次の出力が表示されます。
OutputQuery OK, 0 rows affected (0.02 sec)
データベースにアクセスしたり、データベースに対して特定のアクションを実行したりするには、MySQLユーザーに適切な権限が必要です。 現在、movie-adminにはアプリケーションデータベースに対する適切な権限がありません。
次のコマンドを実行してmovie-adminへのアクセスを許可することで、これを変更します。 MovieAppDb
:
- GRANT ALL PRIVILEGES ON MovieAppDb.* TO 'movie-admin'@'localhost';
次の出力が表示されます。
OutputQuery OK, 0 rows affected (0.01 sec)
これで、次のコマンドを実行して、flushステートメントを使用して行った変更を適用することにより、許可テーブルを再ロードできます。
- FLUSH PRIVILEGES;
次の出力が表示されます。
OutputQuery OK, 0 rows affected (0.00 sec)
これで、新しいユーザーの作成と特権の付与が完了しました。 順調に進んでいるかどうかをテストするには、MySQLクライアントを終了します。
- quit;
作成したMySQLユーザーの資格情報を使用して再度ログインし、プロンプトが表示されたら適切なパスワードを入力します。
- mysql -u movie-admin -p
ユーザーmovie-adminが作成されたデータベースにアクセスできることを確認し、次のことを確認します。
- SHOW DATABASES;
が表示されます MovieAppDb
出力にリストされているテーブル:
Output+--------------------+
| Database |
+--------------------+
| MovieAppDb |
| information_schema |
+--------------------+
2 rows in set (0.01 sec)
ここで、MySQLクライアントを終了します。
- quit;
データベースを作成し、デモアプリケーション用の新しいMySQLユーザーを作成し、新しく作成したユーザーにデータベースにアクセスするための適切な権限を付与しました。 次のセクションでは、デモアプリケーションのセットアップを開始します。
ステップ3—デモアプリとデータベースのクレデンシャルを設定する
前述のように、既存のASP.NETコアアプリケーションを展開します。 このアプリケーションは、ムービーリストを作成するために構築され、Model-View-Controllerデザインパターンを使用して、適切な構造と関心の分離を保証します。 新しいムービーを作成またはリストに追加するには、ユーザーはフォームフィールドに適切な詳細を入力し、作成ボタンをクリックして詳細をコントローラーに投稿します。 この時点で、コントローラーは送信された詳細を含むPOST HTTPリクエストを受信し、モデルを介してデータベースにデータを保持します。
Git を使用して、このデモアプリケーションのソースコードを GitHub からプルし、新しいディレクトリに保存します。 別のアプリケーションをデプロイする場合は、ここから別のアプリケーションをダウンロードすることもできます。
まず、という名前の新しいディレクトリを作成します movie-app
次のコマンドを使用して、ターミナルから:
- sudo mkdir -p /var/www/movie-app
これは、アプリケーションのルートディレクトリとして機能します。 次に、root以外のユーザーアカウントがプロジェクトファイルを操作できるように、フォルダーの所有者とグループを変更します。
- sudo chown sammy:sammy /var/www/movie-app
sammyをsudoの非rootユーザー名に置き換えます。
これで、親ディレクトリに移動して、GitHubでアプリケーションのクローンを作成できます。
- cd /var/www
- git clone https://github.com/do-community/movie-app-list.git movie-app
次の出力が表示されます。
OutputCloning 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からデモアプリケーションのクローンを作成できたので、次のステップは、アプリケーションデータベースへの接続を正常に作成することです。 これを行うには、 ConnectionStrings
内のプロパティ appsettings.json
ファイルを作成し、データベースの詳細を追加します。
ディレクトリをアプリケーションに変更します。
- cd movie-app
次に、ファイルを開いて編集します。
- sudo nano 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)です。
これで、クローン化されたデモアプリケーションのテーブルを使用してデータベースを更新できます。 その目的のために次のコマンドを実行します。
- 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/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
ファイルが作成されますが、アプリケーションはまだ本番用に準備されていません。 アプリケーションを展開できるようにするには、次のコマンドを実行します。
- 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/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/
これにより、アプリケーションがパックおよびコンパイルされ、その依存関係が読み取られ、結果のファイルセットが展開用のフォルダーに公開され、クロスプラットフォームが生成されます。 .dll
インストールされた.NETCoreランタイムを使用してアプリケーションを実行するファイル。
依存関係をインストールし、データベースへの接続を作成し、必要なテーブルでデータベースを更新し、本番環境に公開することで、このデモアプリケーションのセットアップが完了しました。 次のステップでは、ドメインでアプリケーションにアクセスして安全にするように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サーバーの背後で実行することをお勧めします。
まず、サーバーのルートディレクトリ内にいることを確認します。
- cd ~
次のコマンドで編集するためにサーバーブロックを開きます。
- sudo nano /etc/nginx/sites-available/your_domain
Let’s EncryptチュートリアルでNginxを保護する方法のステップ4で詳しく説明されているように、オプション2を選択した場合、CertbotはHTTPトラフィックをHTTPSにリダイレクトするためにこのサーバーブロックを自動的に構成しますほんの少しの変更で。
以下を反映するようにファイルの最初の2つのブロックを編集して、構成を続行します。
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
}
...
このサーバーブロックの構成は、Nginxにポートでリッスンするように指示します 443
、SSLを使用するWebサイトの標準ポートです。 さらに、Nginxはポートでパブリックトラフィックを受け入れます 443
一致するすべてのリクエストを、次の組み込みのKestrelサーバーに転送します。 http://localhost:5000
.
最後に、ファイルで編集したサーバーブロックに続いて、2番目のサーバーブロックが次のようになっていることを確認します。
...
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に強制的に取得させます。
- sudo nginx -s reload
Nginxの構成が正常に完了すると、サーバーは、に行われたすべてのHTTPS要求を転送するように完全に設定されます。 https://your-domain
Kestrelで実行されているASP.NETコアアプリに移動します。 http://localhost:5000
. ただし、NginxはKestrelサーバープロセスを管理するように設定されていません。 これを処理し、Kestrelプロセスがバックグラウンドで実行され続けるようにするには、次を使用します。 systemd
機能。
Systemd ファイルを使用すると、ユニットと呼ばれる作業プロセスを作成した後、開始、停止、再起動、およびログ機能を提供することでプロセスを管理できます。
に移動します systemd
ディレクトリ:
- cd /etc/systemd/systems
編集用の新しいファイルを作成します。
- sudo nano 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
いつ再起動するかを指定するディレクティブ systemd
.NETランタイムサービスがクラッシュした場合のサービス。
次に、ファイルを保存し、次のコマンドで作成された新しいムービーサービスを有効にします。
- sudo systemctl enable movie.service
その後、サービスの開始に進み、サービスを開始してサービスが実行されていることを確認します。
- sudo systemctl start movie.service
次に、そのステータスを確認します。
- sudo systemctl status movie.service
次の出力が表示されます。
Outputmovie.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
ブラウザからアプリケーションを実行してテストします。
デモアプリケーションのホームページが表示されます—ムービーリストアプリケーション。
リバースプロキシが構成され、Kestrelがsystemdを介して管理されると、Webアプリは完全に構成され、ブラウザーからアクセスできます。
結論
このチュートリアルでは、ASP.NETコアアプリケーションをUbuntuサーバーにデプロイしました。 データを永続化および管理するには、MySQLサーバーをインストールして使用し、NginxWebサーバーをリバースプロキシとして使用してアプリケーションを提供しました。
このチュートリアル以外に、Javascriptの代わりにC#を使用してインタラクティブなWebアプリケーションを構築することに興味がある場合は、Blazorと呼ばれるMicrosoftのWebUIフレームワークを試すことができます。 これは、ASP.NETコアアプリケーションのクライアント側にロジックを実装するためのイベント駆動型のコンポーネントベースのWebUIです。
独自のアプリケーションをデプロイする場合は、アプリをデプロイするために必要な他の手順を検討する必要があります。 このデモアプリケーションの完全なソースコードは、GitHubのにあります。