2017-01-09 7 views
2

私はVisual Studioでプロジェクトを作りテストしました。できます。 それをUbuntuサーバーにアップロードしました。 その後、dotnet runで実行してください。動作、リモートマシンはそれを参照してください(nginxプロキシを介して)。バックグラウンドで実行するとKestrelサーバーが動作しません。なぜですか?

その後、私はdotnet run &を試しました。プロセスは開始されたようですが、指定されたポートでは何も聞きません。その後、the exampleによれば、私はsudo nohup dotnet run kestrel > /dev/null 2>&1 &を試しました。今回はしばらく聞いて、その後で死んだ:

アプリケーションが開始しました。 Ctrl + Cを押してシャットダウンします。

は失敗: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [0] 未処理の例外が発生しました:のためにコンパイルライブラリ 場所を見つけることができません:パッケージ「google.protobuf」 のSystem.InvalidOperationExceptionためにコンパイルライブラリの場所を見つけることができません Microsoft.Extensions.DependencyModel.CompilationLibrary.ResolveReferencePathsでパッケージ「google.protobuf」()

(nohup.outからの出力の断片、最初のリネン、私は無関係とプライベートとしてプロジェクトの詳細をスキップ)。

何が起こっているのか?フォアグラウンドで実行してもエラーは発生しません。

これは私が見つけたものです:私はそれを実行することはできません(同じエラーメッセージが表示されます)。私のテストサーバーには、 "dotnet"という特別なユーザーアカウントがあります。 dotnetとしてログインすると、アプリを実行できます。根として私はできません。

root権限でアプリケーションを実行したくないです。

次の試行:私はdotnet restoreをrootとして実行します。それから私はnohup dotnet run kestrel > /dev/null 2>&1 &と一緒に行くと動作します。

ニース。制限付きの権限で私のアプリを起動する方法はありますか?

+0

どのポートに接続していますか? 1024未満のポートにはroot特権が必要です – Tseng

+0

高い1つ、54321。異なるサーバーで同じ操作を試みることで、偶然起こったことがわかりました。この問題は、ポートへのアクセス特権ではなく、.NETの一時ファイルへのファイル特権で発生しました。 – Harry

答えて

3

私は自分自身で答えを見つけたので、分かち合うつもりです。

最初に、完全なroot権限を与えるつもりがない場合は、Linuxの.NETコアプロジェクトをrootとして実行しないでください。私は、root特権を持つWebアプリケーションは悪い考えであり、トラブルを求めていると思います。

しかし、何かがうまくいかないときは、時々sudoを使用したくなるでしょう。それが問題の原因であることが判明しました。同じユーザーが同じ権限で実行する必要があります。

dotnet restoredotnet run私がルートとしてdotnet restoreを発行したとき、それは働いた。それは、より低い特権を持つユーザーとしてプロジェクトを実行したい場合、他の方法ではさらに難しくなります。 dontet restoreを発行する前に、すべての一時ファイルを削除する必要があります。だから、一般的にnohup dotnet run kestrel > /dev/null 2>&1 &が魅力として働いていますが、ここではsudoが必要です。ルートとして実行すると危険です。

今、私はいつも特別なdotnetユーザーを作成し、サーバー上でdotnetアプリケーションを実行します。これはより安全です。ユーザーはsudoできません。管理タスクを実行する必要があるときは、別のルートセッションを開始するだけです。私はデータベースアクセスで同じアプローチを使用します。アプリにはプロシージャを実行する権限しかありません。

関連する問題