バックグラウンドサービスとしてのASP.NET Core Linuxアプリケーションの展開と悪魔化

こんにちは、紳士。 本日は、2年前に危機にwouldしていた議論のトピック、つまりLinuxでのASP.NETアプリケーションの起動に触れます。 この記事ではUbuntu 16.04を使用します

環境の準備


開始するには、ドットネットリポジトリを追加します。

sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list' sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893 

出力では、次のようなものが得られます。

画像

次に、パッケージのインデックスを更新します。

 sudo apt-get update 

次に、apt-getを使用してdotnetパッケージをインストールするだけです。

 sudo apt-get install dotnet-dev-1.0.4 

これで、アプリケーションの作成を安全に開始できます

アプリケーション作成


dotnet newコマンドを使用すると、Visual Studioのテンプレートと同様に、アプリケーションのテンプレートを作成できます。 チームの詳細なドキュメント

現在(2017年7月)、dotnet newコマンドは次のパターンをサポートしています。

画像

ASP.NET Core Webアプリケーションを作成します。

 dotnet new mvc 

出力では、コンソールから次のメッセージが表示されます。

画像

テンプレートが正しく生成されたことを確認するには、 ls -laを使用してフォルダーの内容を調べます。

画像

所定の場所にアプリケーションを構築するために必要なすべてのフォルダー、始めましょう! 最初に、 dotnet restoreを使用してすべてのパッケージを復元します。

画像

これで、アプリケーションをビルドできます。

 dotnet build 

画像

次を使用してアプリケーションを起動します。

 dotnet run 

画像

コンソールは、アプリケーションがlocalhost :5000 /で開始されたことを示しています。 チェック:

画像

Webサーバーがどのように機能するかについて詳しく知りたいので、 公式ソースに送信しています

Ctrl + Cを押してプロセスを強制終了し、dotnet publishコマンドでアプリケーションを公開します。 このコマンドは、アプリケーションとそのすべての依存関係をさらに展開するためにパックします( ここで詳細を知りたい場合)。

アクセス権に問題がある場合は、sudo chmodコマンドとこのドキュメントのページが役立ちます。

サーバーへの展開。

Linuxサーバーの下にアプリケーションをデプロイする場合は、プロキシを構成し、アプリケーションの起動プロセスをデモする必要があります。 プロキシの場合、nginxを使用してsystemdプロセスをデモします。 ユーティリティの簡単な説明

プロキシサーバーを作成します。

上記のドキュメントからわかるように、asp.netコアがボックス内にあるのは、asp.netアプリケーション用のWebサーバーであるkestrelです。 なぜプロキシサーバーが必要なのですか? 答えは、Microsoftの公式ページに記載されています。

画像
インターネットにアプリケーションを配置する場合は、IIS、Nginx、またはApacheをリバースプロキシサーバーとして使用する必要があります。

リバースプロキシサーバーとは何かわからない場合

次の図に示すように、リバースプロキシサーバーは、ネットワークからHTTP要求を受信し、初期処理後にそれらをKestrelに転送します。

画像

リバースプロキシサーバーを使用する主な理由はセキュリティです。 ケストレルは比較的新しく、まだ攻撃に対する完全な防御策がありません。

リバースプロキシサーバーを使用する必要があるもう1つの理由は、サーバー上に同じポートを使用する複数のアプリケーションがあることです。 Kestrelは、複数のアプリケーション間で単一のポートを共有することをサポートしていません。

また、リバースプロキシを使用すると、負荷分散とSSLサポートが容易になります。

上記のように、nginxをプロキシサーバーとして使用します。

なぜなら IISをプロキシサーバーとして使用しないので、Startap.csファイルのConfigureメソッドに次の行を追加する必要があります。

 app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }); 

ここには、パッケージからのForwardedHeadersミドルウェアのサポートが含まれています。 Microsoft.AspNetCore.HttpOverrides。これは、X-Forwarded-ForおよびX-Forwarded-ProtoヘッダーをHttp要求に挿入します。これらのヘッダーは、クライアントのソースIPアドレスを決定し、プロキシサーバーに送信するために使用されます。 ミドルウェイトの定義と実際の使用についても、このガイドの以降の部分で説明します。

nginxがインストールされていない場合は、次のコマンドを実行します。

 sudo apt-get install nginx 

次のコマンドで実行します:

 sudo service nginx start 

次に、httpリクエストをプロキシするようにnginxを設定する必要があります。

ファイル/etc/nginx/sites-available/aspnetcore.confを作成します。 sites-avalibleフォルダーは、nginxに対して、現在のサーバーで処理できるWebサイトを示します。 次の行を追加します。

 server { listen 8888; #  ,   nginx    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; } } 

サイト対応フォルダーにaspnetcore.confへのシンボリックリンクを作成します。これは、nginxによって起動されたサイトを反映しています。

 sudo ln -s /etc/nginx/sites-available/aspnetcore.conf /etc/nginx/sites-enabled/aspnetcore.conf 

シンボリックリンクとは
(シンボリックリンクは、ファイルシステム内の特別なファイルであり、ユーザーデータの代わりに、このリンク(ファイル)(C)ウィキペディア-著者のメモにアクセスするときに開かれるファイルへのパスが含まれます)

Nginxは、localhost:8888からのリクエストを受け入れるように設定されています。 作成した構成ファイルが有効になるように、 sudo service nginx restartコマンドでsudo service nginx restartします。 私たちはチェックします:

画像

エラー502は、サーバーが別の場所にリダイレクトし、この場所で何かがうまくいかなかったことを示しています。 この例では、以前にdotnet runコマンドによって起動されたWebアプリケーションでプロセスを強制終了しました。 私ができるから:)

実際、コンソールでdotnetを実行し、このタブを永久に開いたままにしておくのは悲しいことです。 そのため、プロセスをデモンストレーションします。つまり、再起動後の自動実行とsystemdを使用したバックグラウンドでの自動操作を構成します。

これを行うには、ディレクトリ/ etc / systemd / system /に拡張子.serviceのファイルを作成します

kestrel-testと呼びましょう:

 sudo nano /etc/systemd/system/kestrel-test.service 

そして、次の内容をそこに入れます:
[単位]
説明= Ubuntuで実行されている.NET Web APIアプリケーションの例

[サービス]
WorkingDirectory = / home / robounicorn / projects / asp.net / core / test-lesson / bin / Debug / netcoreapp1.1 / publish#アプリケーションフォルダーを公開するパス
ExecStart = / usr / bin / dotnet /home/robounicorn/projects/asp.net/core/test-lesson/bin/Debug/netcoreapp1.1/publish/test-lesson.dll#公開されたdllへのパス
再起動=常に
RestartSec = 10#アプリケーションがクラッシュした10秒後にサービスを再起動します
SyslogIdentifier = dotnet-example
User = root#サービスを開始するユーザー
環境= ASPNETCORE_ENVIRONMENT =本番

[インストール]
WantedBy = multi-user.target

次のコマンドを使用して、サービスを有効にして開始します。

 sudo systemctl enable kestrel-test.service sudo systemctl start kestrel-test.service 

サービスのステータスを確認します。

 sudo systemctl status kestrel-test.service 

すべてが正しく行われた場合、このコマンドは以下を提供します。

画像

もう一度リンクをたどってください:

画像

まあ、それは帽子です。 ご清聴ありがとうございました!

Source: https://habr.com/ru/post/J332920/


All Articles